我有一个应用程序,该应用程序具有用于该应用程序中多个主题区域的状态类。说它是一个聊天应用程序,主题是用户,聊天消息和聊天室。通过登录对用户进行身份验证/授权。从那里开始,状态取决于登录的用户。当用户注销时,应用程序需要将所有“主题”的状态重置为其默认状态。
问题:
答案 0 :(得分:1)
经过一些额外的研究和实验,我可以回答第二个问题-“如何重置所有状态?”我当时认为动作类与他们所管理的状态完全相关,而实际上并没有。国家可以处理您选择的任何行动。所以:
答案 1 :(得分:1)
每个功能模块都应在功能子目录(请参阅the official style guide)中一对名为feature-name.actions.ts
和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()
函数接受类型{{1 }},因为我们要调用该上下文的StateContext<AuthStateModel>
函数来更新'auth'功能状态。但是,setState()
函数接受类型为UsersState.logout()
的上下文,因为我们要调用那个上下文的StateContext<UsersStateModel>
函数来重置“用户”功能状态。 / p>
每个附加功能模块都可以以与UsersState相同的方式响应注销操作,并重置自己的状态片。