如何在另一个选择器中调用NGRX选择器(接受要计算的参数)

发布于 2025-02-04 11:52:23 字数 707 浏览 4 评论 0 原文

我创建了两个选择器

  1. 以获取所有网络 - 导出const getallnetworks = createSelector(getState,state => state.networks);

  2. 获取每个网络的设备

      createSelector(getallnetworks,network => {
        const selectionnetwork = network.filter(net => net.id ===== networkId);
        返回selectednetwork [0]?。alldevices;
      });
    
     

我想创建一个使用第一个选择器获取网络的第三个选择器,然后使用第二个选择器获取其他数据

export const something = createSelector(
  getAllNetworks, (networks) => {
    networks.map(

      // How can I call the selector selectNetworkDevices by passing the network ID here and get the devices [ex: selectNetworkDevices(network.id)]

    )
  }
)

I created two selectors

  1. To get all networks -
    export const getAllNetworks = createSelector(getState, state => state.networks);

  2. get devices for each network

      createSelector(getAllNetworks, network => {
        const selectedNetwork = network.filter(net => net.id === networkId);
        return selectedNetwork[0]?.allDevices;
      });
    
    

I wanted to create a third selector which uses the first selector to get networks and then uses the second selector to get additional data

export const something = createSelector(
  getAllNetworks, (networks) => {
    networks.map(

      // How can I call the selector selectNetworkDevices by passing the network ID here and get the devices [ex: selectNetworkDevices(network.id)]

    )
  }
)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

长伴 2025-02-11 11:52:23

您可以基于其他类似的选择来使用不同的选择器:

export const selectUsers = createSelector(getState, (state) => state.users);

export const selectAccounts = (accountId?: string) => 
 createSelector(getState, (state) => 
   accountId ? state.accounts[accountId] : {}
 );

export const something = (accountId?: string) => 
  createSelector(
    selectUsers,
    selectAccounts(accountId),
    (usersData, accountsData) => {
      // some logic
      return accountId ? 'an account id was provided' : 'no-id'
    }
  )

在组件中,您可以调用此选择器提供参数是否提供参数:

ngOnInit(): void {
  this.store.select(something());  // without parameter
  this.store.select(something('anAccountId')); // with parameter
}

更多信息在这里: link

更新:

我们有2个 selectors selectaccounts Myotherselector 。对于 Myotherselector ,您可以通过调用其回调函数来重复使用 selectAccounts 选择器,而是可以重复使用其逻辑。

export const selectUsers = createSelector(getState, (state) => state.users);

export const selectAccounts = (accountId?: string) => 
 createSelector(getState, (state) => filterAccount(state));

export const myOtherSelector = createSelector(
  selectUsers,
  (users) => {
    if (users) return users;

    // here, you are reusing the callback function related to
    // another selector
    const accountFiltered = filterAccount([]);
    return accountFiltered;
  }
)

function filterAccount(accounts): Account {
 //...some complex logic 
 // ...
 // ...
 return account[index];
}

You can use different selectors based on others like this:

export const selectUsers = createSelector(getState, (state) => state.users);

export const selectAccounts = (accountId?: string) => 
 createSelector(getState, (state) => 
   accountId ? state.accounts[accountId] : {}
 );

export const something = (accountId?: string) => 
  createSelector(
    selectUsers,
    selectAccounts(accountId),
    (usersData, accountsData) => {
      // some logic
      return accountId ? 'an account id was provided' : 'no-id'
    }
  )

In your component you could call this selector either providing the parameter or not:

ngOnInit(): void {
  this.store.select(something());  // without parameter
  this.store.select(something('anAccountId')); // with parameter
}

More information here: link

UPDATE:

We have 2 selectors, selectAccounts and myOtherSelector. For myOtherSelector, instead of calling directly the selectAccounts selector, you can reuse its logic by calling its callback function.

export const selectUsers = createSelector(getState, (state) => state.users);

export const selectAccounts = (accountId?: string) => 
 createSelector(getState, (state) => filterAccount(state));

export const myOtherSelector = createSelector(
  selectUsers,
  (users) => {
    if (users) return users;

    // here, you are reusing the callback function related to
    // another selector
    const accountFiltered = filterAccount([]);
    return accountFiltered;
  }
)

function filterAccount(accounts): Account {
 //...some complex logic 
 // ...
 // ...
 return account[index];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文