NGRX:如何从其他选择器中调用工厂选择器

Posted

技术标签:

【中文标题】NGRX:如何从其他选择器中调用工厂选择器【英文标题】:NGRX: how to call factory selectors from within other selectors 【发布时间】:2022-01-20 01:08:28 【问题描述】:

由于 NGRX deprecated selectors with props 在版本 11 中。使用属性的预期方法是创建工厂选择器,

如何嵌套选择器,或者从另一个调用一个并在它们之间传递状态?

改变之前,有以下两个选择器

export const selector1 = createSelector(
   state,
   ( state: FormState, props: id: string ) => 
       // Return items whose parent match the given id
       return state.items.filter( item => item.parentId === props.id);
   
);

export const selector2 = createSelector(
    state
    ( state, FormState, props:  id: string ) => 
       return state.notes.filter( note => note.parentId === props.id);
    
)

您可以从另一个选择器中调用其中一个,如下所示

export const selector3 = createSelector(
   state,
   ( state: FormState, props: id: string ) => 
       // get notes by using an existing selector and passing the state & properties
       const notes = selector2( storeName: state, props)
       // do some more logic based on the nested call to a selector
       ...
   
);

现在工厂选择器是处理属性时的预期格式,选择器现在看起来像下面这样

export const selector1 = (id: string) => createSelector(
   state,
   ( state: FormState ) => 
       // Return items whose parent match the given id
       return state.items.filter( item => item.parentId === id);
   
);

export const selector2 = (id: string) => createSelector(
    state
    ( state, FormState ) => 
       return state.notes.filter( note => note.parentId === id);
    
)
给定工厂选择器,有没有办法从selector1 中调用selector2 如果是,状态是如何传递给嵌套选择器的

例如

export const selector3 = (id: string) => createSelector(
   state,
   ( state: FormState ) => 
       // how is the `state` passed to the nested selector call below? 
       const notes = selector2( id)
   
);

谢谢。

【问题讨论】:

【参考方案1】:

createSelector 函数可以接收其他选择器作为参数。

所以你可以这样做:

export const selector3 = (id: string) => createSelector(
   state,
   select2(id),
   (state: FormState, filteredNotes ) => 

       const notes = filteredNotes;
   
);

【讨论】:

感谢您的回复。我在其他一些选择器中使用这种方法。但我想知道是否有一种方法可以调用选择器,而不是将其作为参数包含在内?即允许在调用选择器之前应用条件业务逻辑。即在调用选择器之前检查id 参数是否有效... 不确定是否通过有条件地应用选择器获得显着的性能改进,它们是非常精益的函数。您可以调用所有需要的选择器作为参数,而不是选择性地使用它们的值。

以上是关于NGRX:如何从其他选择器中调用工厂选择器的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试中使用参数模拟 ngrx 存储选择器(Angular)

如何从图像选择器中裁剪图像?

如何限制用户从日期选择器中选择过去的日期?

ngrx 4 选择器返回整个状态而不是子状态

我如何在文本输入中显示从时间选择器中选择的时间?

JQuery:如何抓取选择器中选择的内容