-
每个功能模块应该在一对名为
feature-name.actions.ts
和
feature-name.state.ts
,位于功能子目录中(请参见
the official style guide
)。
-
正如您所说,每个特性状态都可以响应在其他状态中定义的操作,并相应地更新自己的状态。下面是一个例子:
src/app/auth/auth.state.ts(源代码/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”功能状态。但是,
用户状态。注销()
函数接受类型的上下文
StateContext<UsersStateModel>
,因为我们想打电话
那个
上下文
设置状态()
用于重置“用户”功能状态的函数。
每个附加的功能模块可以像用户状态一样响应注销操作,并重置自己的状态切片。