Angular 2 ngrx/store 个最佳实践

Angular 2 ngrx/store best practice

在我的 angular 2 个应用程序中,我开始将所有项目重构为 ngrx 模式,但我仍然有一些问题:

我的应用程序做什么我检索应用程序列表和应用程序类别列表

1- 在这种情况下,我可以像 "selectedCategory" 那样管理状态(只能选择一个,因此它只是一个原始的)吗? :

Categories.component.ts

...
...
OnCategorySelect (applicationID : string) {
this.selectedCategory = applicationID 
}

或者我应该为此创建一个 selectedCategory reducer 吗?

2 - 当将数据从智能组件 (applicationsListComponent) 传递到哑组件 (categoryComponent) 时,我使用异步管道这样做:

**ApplicationsListComponent.ts**

....
....
<app-category [categories]='appCategories | async'></app-category>

在这种情况下,我应该将 changeDetection: ChangeDetectionStrategy.OnPush 放在哑组件中吗?

3- 在我的哑组件 (categoryComponent) 中,当我从带有 @Input 的智能组件收到 categories 时,我没有将其声明为 Observable,但我正在这样做:

category.component.ts

 @Input() appCategories: CategoryInfo[];

category.component.html

<div *ngFor='let app of appCategories'>....</div>

所以在这种情况下,我不知道是否必须将@Input 从智能组件接收到的数据声明为 Observable。

有什么建议吗?

1- 对于这种情况,我创建了单独的减速器 "selectedCategory"。它的实现非常简单

    import { ActionReducer, Action } from '@ngrx/store';
    import { SELECT_CATEGORY } from '../actions';

    export const selectedCategory: ActionReducer<ICategory> = (state: ICategory, {type, payload}: Action) => {
        switch (type) {
            case SELECT_CATEGORY:
                return payload;

            default:
                return state;
        }
    };

2- 是的。在 ngrx 中存储是不可变的。这意味着如果某些对象的 属性 已更改,则 Angular 没有必要监视。更改输入数据的唯一方法是更改​​整个 @Input 对象。所以 changeDetection: ChangeDetectionStrategy.OnPush 没问题。

3- 不。@Input 属性不应该是 Observables。通过 async 管道(如您的示例)绑定它们就足够了。如果您将 Observable 直接传递给转储组件(没有 async),那么 Angular 更改检测将不会按预期工作。对 Observable 对象的引用将始终保持不变,即使实际数据会发生变化。在这种情况下,如果您想对数据更改做出反应,您将需要手动订阅(和取消订阅)Observable,这将变得一团糟。

在@user1614543 的回答中添加更多内容

如果您想检测来自可观察源的@Input 上的变化。

在您的哑组件中使用以下代码。

ngOnChanges(changes: SimpleChanges) { 
  if (changes.hasOwnProperty('appCategories')) {
     ...
  }
}