0

我有一个应用程序,它具有应用程序中多个主题领域的状态类。假设它是一个聊天应用程序,主题是用户、聊天消息和聊天室。用户通过登录进行身份验证/授权。从那里之后的状态取决于登录的用户。当用户注销时,应用程序需要将所有“主题”的状态重置为默认状态。

问题:

  1. 组织这些州的最佳方式是什么?这似乎是子状态的一个很好的用法,但是子状态文档讨论了如何设置子状态,但没有显示任何关于状态“绑定在​​一起”意味着什么的示例
  2. 如何重置所有状态?这是重置 API 的好用法吗?
4

2 回答 2

1

经过一些额外的研究和实验,我可以回答第二个问题——“如何重置所有状态?” 我认为动作类只与它们管理的状态相关联——它们不是。状态可以处理您选择的任何操作。所以:

  1. 标头组件注入 Store 服务。
  2. 标头的 onLogout 调度 Logout 操作。
  3. 通过重置存储的 JWT 的身份验证状态响应
  4. 任何其他状态都可以响应 Logout 来重置自己
于 2018-07-10T13:18:12.760 回答
1
  1. feature-name.actions.ts每个功能模块都应该在一对名为and的文件中定义自己的状态片段,这些文件feature-name.state.ts位于功能子目录中(请参阅官方样式指南)。

  2. 正如您所说,每个功能状态都可以响应其他状态中定义的操作,并相应地更新自己的状态。这是一个例子:


src/app/auth/auth.state.ts:

...
// Import our own actions, including the Logout action
import { Logout, ... } from './auth.actions';


export interface AuthStateModel {
  token?: string;
  currentUser?: User;
  permissions: string[];
}

const defaults: AuthStateModel = {
  token      : null,
  currentUser: null,
  permissions: [],
};


@State<AuthStateModel>({
  name: 'auth',
  defaults
})
export class AuthState {
  ...
  // Respond to the Logout action from our own state
  @Action(Logout)
  logout(context: StateContext<AuthStateModel>) {
    context.setState({ ...defaults });
  }
  ...
}

src/app/users/users.state.ts:

...
// Import our own actions
import { LoadAllUsers, ... } from './users.actions';

// Import the Logout action from the Auth module
import { Logout }       from '../auth/auth.actions';


export interface UsersStateModel {
  users?: User[];
}

const defaults: UsersStateModel = {
  users: null,
};


@State<UsersStateModel>({
  name: 'users',
  defaults
})
export class UsersState {
  ...
  // An example of the usual case, responding to an action defined in
  // our own feature state
  @Action(LoadAllUsers)
  loadUsers(context: StateContext<UsersStateModel>, action: LoadAllUsers) {
    ...
  }


  // Respond to the Logout action from the Auth state and reset our state (note
  // that our context is still of type StateContext<UsersStateModel>, like the other
  // actions in this file
  @Action(Logout)
  logout(context: StateContext<UsersStateModel>) {
    context.setState({ ...defaults });
  }
  ...
}

请注意,尽管AuthState.logout()UsersState.logout()都响应Logout操作(在 AuthState 模块中定义),但该AuthState.logout()函数接受类型为 的上下文StateContext<AuthStateModel>,因为我们希望调用该上下文的setState()函数来更新“auth”功能状态。但是,该UsersState.logout()函数接受 type 的上下文StateContext<UsersStateModel>,因为我们想调用上下文的setState()函数来重置“用户”功能状态。

每个附加功能模块都可以以与 UsersState 相同的方式响应 Logout 操作,并重置它们自己的状态片段。

于 2018-07-25T18:37:47.010 回答