2017-08-02 81 views
2

我想知道如果商品不在商店中,那么获取商品的最佳方式是什么。如果商品不在商店中,请发送一个操作以获取它

例如,假设我有一个用户列表,我想获取特定用户。如果该用户不在商店中,我想从数据库中取回他。

下面的代码是否被认为是最佳实践还是有更好的方法呢?

const searchedUserId = 'abcdefg'; 
this.selecedUser$ = this.store.select(state => { 
    const selectedUserIndex = state.userList.findIndex(searchedUserId) 
    if (selectedUserIndex === -1) { 
    this.store.dispatch(new UsersActions.FetchUsers(searchedUserId)); 
    } else { 
    return state.userList[selectedUserIndex] 
    } 
}) 
+0

商店应该是您的应用程序中唯一的数据来源。因此,如果用户不在商店中,您应该派发一个操作来获取数据并更新商店,然后您应该从商店中检索数据。 –

+0

但为了取回用户,我需要听商店。 只有在选择器内我可以做检查... – doron

回答

0

创建selector以从商店获取数据。

Creating a selector

在你的组件,你需要subscribe的状态。

store.select(selectFeatureState).subscribe(state => { 
    //Search for the user in the state. 
    // If user is not there then dispatch the action 
    store.dispatch(ACTION); 
}); 

然后,创建Effects使用@ NGRX /效应

create effects

影响监听操作,然后调用服务,检索数据,并更新商店。

由于商店已经订阅商店,它将更新组件。

+0

我了解商店/效果是如何工作的。我问是否我写的代码(你实际上写的也是这样)被认为是最好的练习 – doron

0

你需要一名警卫。

  1. 定义一个路由,您的用户资料组件(包含ID)
  2. 定义一个后卫这条路线,并把它放在CanActivate
  3. 在后卫,派遣LoadUserDetailsAction(用户ID)
  4. 当该行动做出决议(后卫监听加载详细信息时商店)返回true,这样您的组件可以显示
  5. 它现在可以安全在yoir组件做store.select(的UserDetails)
+0

一个守卫甚至更糟糕的做法,然后我问上面。警卫应该阻止你访问页面,而不是加载更多的数据。如果我想要这种方法,我可以使用解析方法。 – doron

+0

没有人说警卫正在加载除你以外的任何数据:)。警卫队准确地做到了它的目的:确保你不会激活未准备好的组件。不加载单个数据。您将解析方法与状态一起使用的想法非常奇怪,因为这种方式与状态管理的目的完全相反:您的应用程序的单一来源。但如果你认为这是一种良好的做法,我是谁来阻止你;) –

+0

首先,我感谢你的帮助。但在这个问题上,我仍然认为高尔夫不是正确的解决方案。我确信,在这种方式下,解决问题将是更好的方式。但无论如何,这不是我所需要的 – doron