2016-09-26 55 views
3

我基本上遵循this guide來實現Observable數據服務。Observable中的更改不反映在視圖中

在商店類(ItemsStore),我有我的BehaviorSubject持有該項目的列表

items:BehaviorSubject<List<Item>> = new BehaviorSubject(List([])); 

的組件使用該存儲在模板如下:

<ion-slide *ngFor="let item of itemStore.items | async" > 
    [...] 
</ion-slide> 

現在這當應用程序加載時工作正常 - 我的所有項目都顯示。不過,如果我使用下面的代碼在店裏類添加項目到BehaviorSubject

this.items.next(this.item.getValue().push(newItem)); 

這沒有反映在視圖中。我的印象是,變更處理由angular2自動完成,但似乎並非如此。

如何檢測並處理這些更改,以便它們反映在視圖中?

回答

1

items屬性應該是可觀察的,但您將其設置爲BehaviourSubject類型。在你的鏈接有:

@Injectable() 
export class TodoStore { 
    private _todos: BehaviorSubject<List<Todo>> = new BehaviorSubject(List([])); 

    public todos: Observable<List<Todo>> = this._todos.asObservable(); 

    constructor(private todoBackendService: TodoBackendService) { 
     this.loadInitialData(); 
    } 
    ... 
} 

所以假設你遵循本教程中,你應該做這樣的事情:

private _items: BehaviorSubject<List<Item>> = new BehaviorSubject(List([])); 
public items: Observable<List<Item>> = this._items.asObservable(); 
+0

你絕對是對的,完全錯過了。雖然我不明白爲什麼當'BehaviourSubject'出現'Observable'時爲了調用'.asObservable()'。不幸的是它仍然不起作用。 –

1

我懷疑問題出在你的方式撥打電話:

this.items.next(this.item.getValue().push(newItem)); 

我不知道什麼this.item.getValue()返回,但如果push()方法是相同的Array.push()它返回新的長度(重要的是它不會返回附帶新條目的)。

async管被定義爲:

異步管訂閱了可觀察到的或無極並返回它已發出最新的值。

因此,當您撥打this.items.next(...)時,異步管道只收到新長度並嘗試用*ngFor進行迭代。

如果this.item持有<List<Item>>,那麼你可能想打電話:

this.item.getValue().push(newItem); 
this.items.next(this.item); 

順便說一句,該asObservable()方法用來隱藏你與Subject工作的事實。主題讓我們打電話next()complete()這是你不希望其他用戶搞砸的東西。出於這個原因,最好只是通過Observable,並且只爲自己保留Subject,只要你知道你需要它。

1

解決了它 - 這是一個非常愚蠢的錯誤 - 對我感到羞恥。ItemsStore被注入到兩個不同的類中,並且由於依賴注入爲每次注入創建了一個實例 - 那麼,我們有兩個應該只有一個的實例。

將依賴項(ItemsStore)移至全局提供者數組解決了問題。

相關問題