2

AsyncPipe работает с BehaviorSubject, но я не хочу инициализировать мою службу пустыми данными, поэтому я использую тему.Угловой 2.0.1 AsyncPipe не работает с Rx Subject

Проблема заключается в том, что NgFor и asyncPipe не работают с Subject, это проблема?

Это работает:

Компонент:

export class AppComponent { 
    foo = new BehaviorSubject<Array<number>>([1,2,3]); 

    getFoo(){ 
    return this.foo.asObservable(); 
    } 
} 

Шаблон

<span *ngFor="let e of foo.asObservable() | async">{{e}}</span> 

Это НЕ РАБОТАЕТ:

Компонент

export class AppComponent { 
    foo = new Subject<Array<number>>(); 

    constructor(){ 
    setTimeout(() => { 
      this.foo.next([1,2,3]); 
    }, 3000); 
    } 

    getFoo(){ 
    return this.foo.asObservable(); 
    } 
} 

Шаблон

<span *ngFor="let e of foo.getFoo() | async">{{e}}</span> 
+0

Можете ли вы предоставить скрипку/плунжер, чтобы воспроизвести проблему? – estus

+0

См. Update @estus – Serginho

+0

Я думаю, проблема заключается в '.asObservable()', ее не должно быть. – estus

ответ

4

Проблема здесь вызов метода из моего шаблона - это означает, что каждый раз, когда обнаружение изменений работает, я звоню функцию вашего getFoo(), которая возвращает новый экземпляр наблюдаемых , который сбрасывает асинхронную трубу.

Таким образом, код не работает, вы вызываете getFoo() в NgFor.

Solucion, создайте наблюдаемую переменную в компоненте.

+0

Вы не вызываете 'getFoo()' в любом месте вашего шаблона. – martin

+0

Извините, в неправильном случае я создал 'getFoo()', но я забыл назвать его в представлении. Я просто обновляю его сейчас. Во всяком случае, такое же поведение я вызывал 'asObservable()'. Благодарю. – Serginho

+0

Глупый я, ты прав насчет обнаружения изменений! – martin

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