2017-01-15 10 views
2

Кто-нибудь, почему этот код (инициализирующий значение из темы) не работает? Есть ли ошибка или по дизайну? Что я делаю не так?Subject.next not firing in ngOnInit

ц

import { Component, OnInit } from '@angular/core'; 
import { Subject } from "rxjs"; 

@Component({ 
    selector: 'app-root', 
    templateUrl: './app.component.html', 
    styleUrls: ['./app.component.styl'] 
}) 
export class AppComponent implements OnInit { 
    itemSupplier$: Subject<any[]> = new Subject<any[]>(); 

    items: any[] = [ 
    {name: 'Item 1', value: 'item1'}, 
    {name: 'Item 2', value: 'item2'}, 
    ]; 

    ngOnInit(){ 
    this.itemSupplier$.next(this.items); 
    } 
} 

HTML

<ul> 
    <li *ngFor="let item of itemSupplier$ | async">{{item.name}}</li> 
</ul> 
+2

Не могли бы вы расшириться на * «не работает» *? – jonrsharpe

ответ

3

Похоже, ошибки синхронизации, если бросить его в SetTimeout он работает.

setTimeout(() => this.itemSupplier$.next(this.items), 0)

EDIT

Это на самом деле лучше использовать BehaviorSubject. Это даст последнее значение, когда оно подписано.

+0

Да, на самом деле я обнаружил это сразу после того, как я разместил свой вопрос, но все же мне непонятно, почему я должен прибегать к использованию 'setTimeout' в этом конкретном случае. – user776686

+0

Я отлаживал его угловатым, и похоже, что асинхронная трубка не регистрирует подписку до ПОСЛЕ ngOnInit, поэтому вы вызываете следующий, не подписываясь. – Steveadoo

+0

О, спасибо за ваши усилия! Считаете ли вы, что нужно сообщать команде угловатого или rx как ошибку? Или я должен использовать AfterInit вместо этого? – user776686

0

У меня была одна и та же проблема, и setTimeout был эффективен как решение, но обнаружил, что мне не нужно использовать setTimeout, если Observable, которому был назначен вывод метода switchMap(), был подписан на PRIOR для вызова следующего (). В вашем примере может потребоваться создание Observable, подписка и обновление свойства напрямую, а не использование асинхронного канала.

0

Вы можете сделать свой следующий звонок в hook afterViewinit. Асинхронная труба будет подписаться на Субъект в настоящий момент

 Смежные вопросы

  • Нет связанных вопросов^_^