注销时重置应用程序状态

时间:2018-07-09 13:38:39

标签: ngxs

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

问题:

  1. 组织这些状态的最佳方法是什么?似乎很好地使用了子状态,但是子状态文档讨论了如何设置子状态,但没有显示任何示例说明状态“绑定在​​一起”的含义。
  2. 如何重置所有状态?这是reset API的好用法吗?

2 个答案:

答案 0 :(得分:1)

经过一些额外的研究和实验,我可以回答第二个问题-“如何重置所有状态?”我当时认为动作类与他们所管理的状态完全相关,而实际上并没有。国家可以处理您选择的任何行动。所以:

  1. 标头组件将注入Store服务。
  2. 标头的onLogout调度一个Logout操作。
  3. 通过重置存储的JWT进行身份验证状态响应
  4. 其他任何状态都可以响应注销以重置自身

答案 1 :(得分:1)

  1. 每个功能模块都应在功能子目录(请参阅the official style guide)中一对名为feature-name.actions.tsfeature-name.state.ts的文件中定义自己的状态切片。

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


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()函数接受类型{{1 }},因为我们要调用该上下文的StateContext<AuthStateModel>函数来更新'auth'功能状态。但是,setState()函数接受类型为UsersState.logout()的上下文,因为我们要调用那个上下文的StateContext<UsersStateModel>函数来重置“用户”功能状态。 / p>

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