我是 Redux 的新手,从 ngrx 开始。我无法理解这行代码的含义store.select
:
clock: Observable<Date>;
this.clock = store.select('clock');
我是 Redux 的新手,从 ngrx 开始。我无法理解这行代码的含义store.select
:
clock: Observable<Date>;
this.clock = store.select('clock');
用非常简单的术语来说,select 将应用程序状态中的一部分数据返回到一个 Observable 中。
它的意思是,select 运算符获取您需要的数据块,然后将其转换为 Observable 对象。所以,你得到的是一个包装了所需数据的 Observable。要使用您需要订阅的数据。
让我们看一个非常基本的例子。
让我们定义我们商店的模型
export interface AppStore {
clock: Date
}
将商店从“@ngrx/store”导入您的组件
通过注入构造函数来创建商店
constructor(private _store: Store<AppStore>){}
Select 返回一个 Observable。
因此,在您的组件中声明时钟变量如下:-
public clock: Observable<Date>;
现在您可以执行以下操作:-
this.clock = this._store.select('clock');
哇,这是一个很大的话题。所以基本上“选择”实际上是一个 RXJS 运算符,在这种情况下用于检索应用程序状态对象的一部分的值。因此,假设您的主应用程序状态具有一组用户和一组安全功能。“选择”允许您获取对可观察对象的引用,该可观察对象的值就是该用户数组。在你进入 ngrx 之前,你真的需要学习 Observables 和 RXJS。我发现这篇文章从 Github 主项目页面链接到 ngrx 很有帮助。
https://gist.github.com/btroncone/a6e4347326749f938510
RXJS 和 redux 可能是一个很大的话题,但我建议你在小块中学习你的知识。在我真正开始感到舒服之前,我花了大约 2 个月的时间来使用它。即使您不使用 ngrx,了解 RXJS 的工作原理也非常有用,值得花时间学习它。
这是一篇 gist 文章,它也很好地介绍了 RXJS。 https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
它返回称为“时钟”的状态。
这是一个例子。在构造函数中调用了 store.select,这次是 'todos'。
https://github.com/btroncone/ngrx-examples/blob/master/todos/src/app/todo-app.ts
export class TodoApp {
public todosModel$ : Observable<TodoModel>;
//faking an id for demo purposes
private id: number = 0;
constructor(
private _store : Store<AppState>
){
const todos$ = _store.select<Observable<Todo[]>>('todos');
const visibilityFilter$ = _store.select('visibilityFilter');
...
在引导程序中,provideStore 被赋予 APP_REDUCERS
import {bootstrap} from '@angular/platform-browser-dynamic';
import {TodoApp} from './todo-app';
import {provideStore} from "@ngrx/store";
import * as APP_REDUCERS from "./reducers/reducers";
export function main() {
return bootstrap(TodoApp, [
provideStore(APP_REDUCERS)
])
.catch(err => console.error(err));
}
APP_REDUCERS 是定义的所有减速器。todos reducer 定义如下:
import {ActionReducer, Action} from "@ngrx/store";
import {Todo} from "../common/interfaces";
import {ADD_TODO, REMOVE_TODO, TOGGLE_TODO} from "../common/actions";
export const todos : ActionReducer<Todo[]> = (state : Todo[] = [], action: Action) => {
switch(action.type) {
case ADD_TODO:
return [
...state,
action.payload
];
有几种方法可以做到这一点,您可以组成所有减速器的列表,本质上定义一系列引用减速器对象的对象键。
Store.select 返回一个 observable,你可以通过“|async”在组件或模板中订阅它。
this.store.select('keyname') 将返回来自 'keyname' 属性的存储对象的数据。您可以使用带有 StoreModule.forFeature("master", masterReducer) 的多个 reducer 在带有 createSelector 的主模块中进一步查找存储中的内部对象
export const getMasterState = createFeatureSelector<myModels.MasterState>('master');
export const getMatserBranchList = createSelector(
getMasterState,
(state: myModels.MasterState): myModels.Branch[] => state.branchList
);