ngrx store.select方法如何传递商店上下文?

时间:2017-03-12 17:29:44

标签: rxjs ngrx reselect

在这个ngrx example component中,在第27行,您将看到

this.books$ = store.select(fromRoot.getSearchResults);

选择器功能getSearchResults由其他选择器功能组成,innermost selector functionsgetSearchStategetBoosState

我的问题是

  • store.select是RxJS Observable函数还是ngrx函数?
  • store.select函数如何传递商店上下文,以便最里面的函数可以访问它?

1 个答案:

答案 0 :(得分:4)

select是一个RxJS运算符,它在@ngrx/core中定义,并作为Store的方法绑定。

Store是一个可观察的,它在收到动作后发出状态并通过其组合的减速器传递了所述动作。因此select运算符接收状态作为Store可观察值发出的值。

如果您对状态本身的位置感到好奇,Store会使用State可观察的as its sourceState observable是RxJS BehaviorSubject

getSearchResults选择器使用reselect组成。 createSelector函数创建一个选择器,将其收到的状态传递给getBookEntitiesgetSearchBookIds选择器 - 然后将其结果合并/连接。

reselect用于创建选择器,因为它的选择器是memoized。也就是说,选择器结果被缓存/记忆,并且只有在输入改变时才重新运行选择器。这可以显着提高效率,因为每次商店可观察到的状态都会重新运行选择器。

所以流程是:

  • State观察者会发出状态。
  • State observable是Store的来源,所以它也会发出状态。
  • getSearchResults用于select上的Store运算符。
  • getSearchResults收到状态并将其传递给撰写的getBookEntitiesgetSearchBookIds选择器。
  • getBookEntities收到状态并使用getBooksState选择图书状态,并将其传递给fromBooks.getEntities
  • getSearchBookIds收到状态并使用getSearchState选择图书状态,并将其传递给fromBooks.getEntities
  • 然后合并书籍和搜索ID,结果就是选择器返回的内容。