我有一个应用程序,它具有应用程序中多个主题领域的状态类。假设它是一个聊天应用程序,主题是用户、聊天消息和聊天室。用户通过登录进行身份验证/授权。从那里之后的状态取决于登录的用户。当用户注销时,应用程序需要将所有“主题”的状态重置为默认状态。
问题:
- 组织这些州的最佳方式是什么?这似乎是子状态的一个很好的用法,但是子状态文档讨论了如何设置子状态,但没有显示任何关于状态“绑定在一起”意味着什么的示例
- 如何重置所有状态?这是重置 API 的好用法吗?
我有一个应用程序,它具有应用程序中多个主题领域的状态类。假设它是一个聊天应用程序,主题是用户、聊天消息和聊天室。用户通过登录进行身份验证/授权。从那里之后的状态取决于登录的用户。当用户注销时,应用程序需要将所有“主题”的状态重置为默认状态。
问题:
经过一些额外的研究和实验,我可以回答第二个问题——“如何重置所有状态?” 我认为动作类只与它们管理的状态相关联——它们不是。状态可以处理您选择的任何操作。所以:
feature-name.actions.ts
每个功能模块都应该在一对名为and的文件中定义自己的状态片段,这些文件feature-name.state.ts
位于功能子目录中(请参阅官方样式指南)。
正如您所说,每个功能状态都可以响应其他状态中定义的操作,并相应地更新自己的状态。这是一个例子:
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 操作,并重置它们自己的状态片段。