2017-04-24 15 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