2017-04-24 37 views
0

我從@ngrx example以下代碼。僅當新的結果是從先前的不同如何通過@ngrx store.select始終發出狀態?

constructor(private store: Store<fromRoot.State>) { 
    this.searchQuery$ = store.select(fromRoot.getSearchQuery).take(1); 
    this.books$ = store.select(fromRoot.getSearchResults); 
    this.loading$ = store.select(fromRoot.getSearchLoading); 
    } 

在上面的代碼中,store.select將發射值。

無論新流與上一個流相同還是不同,我怎樣才能發出this.books$?我必須使用哪種store方法?

回答

2

可以使用rxjs運營商map - 它的工作原理略有不同select雖然:

store.map(state => state.someAttribute.someSub); 

雖然它是正確的,當選擇了項目改變select只會發出的數據 - 問題是:爲什麼你需要更新?如果數據沒有變化,則不需要更新視圖。

+0

我有一種情況,UI通過''@ngrx effect'''從'''@ngrx DB'''('''cache''')請求數據。如果'''cache'''中沒有數據,我發送一個動作,並且在檢查這個動作中的有效載荷的reducer中什麼也沒找到,然後設置一個名爲'''cacheAvailbility''的狀態屬性到''' ''false'''。該狀態由容器'''observer'''訂閱,啓動另一個操作從數據庫讀取。所以這個''''observer'''已經訂閱的狀態可以是''''''''''如果''''''''''''中沒有數據,可以再次使用'false'。在這兩種情況下,準備好數據庫是必要的。 –

+0

我使用'''state''來管理緩存可用性,這可能使這變得複雜。我可以在效果本身中派發另一個動作,但是接下來我必須使用像if語句一樣的'''if'''語句if(data === undefined)store.dispatch(new ReadFromDBAction(customerId)) }其他{ \t store.dispatch(新ReachFromCacheSuccessfulAction(客戶ID)) }''' –

+1

聽起來好像有些複雜的架構,我敢肯定,可以簡化 - 但這可能是一個不同的問題的一部分 - 只要一件事:不要在效果中使用'dispatch' - 效果應該只返回後續動作 - 在效果中間調度一個動作__will__會導致ngrx-store中的複雜問題 – olsn