14

我的问题与从 ngrx 商店调度选择有关。

让我们看一下官方示例应用程序中的以下代码:

export class CollectionPageComponent implements OnInit {
  books$: Observable<Book[]>;

  constructor(private store: Store<fromBooks.State>) {
    this.books$ = store.select(fromBooks.getBookCollection);
  }

  ngOnInit() {
    this.store.dispatch(new collection.Load());
  }
}

我想了解是什么促使选择ngOnInit.constructor

任何人都可以提供解释吗?

PS顺便说一句,上面是来自ngrx示例应用程序的示例代码,可以在这里找到:https ://github.com/ngrx/platform/blob/master/example-app/app/books/containers/collection-page .ts

4

2 回答 2

5

构造函数在类被实例化时执行,并确保类字段的正确初始化。这是 Angular 解析提供者的地方,你可以在构造函数中作为参数传递。

在第一次检查数据绑定属性(组件的输入和输出)后调用 ngOnInit 生命周期挂钩。有关更详细的解释,请参阅此问题

据我了解,从构造函数中的 ngrx 存储中选择并从 ngOnInit调度的动机是,选择初始化组件类的一部分。因为this.books$它是一个 Observable,所以在构造函数中初始化它是有意义的,这样它就可以在创建后立即使用。假设在bookCollection.Load()发出最终值之前this.books$,您希望this.books$成为这些书籍的可观察者。

由于您希望将这些值发送给this.books$它,因此在 ngOnInit中调度操作是有意义的。这样您就可以确定this.books$已初始化。

This answer to a similar question也可能会有所帮助。

于 2017-11-16T09:35:21.713 回答
-2

在我看来,主要原因是关注点分离。构造函数是您定义所有依赖项的地方。因此,在这种情况下,获取商店而不是选择其中的一部分。

但是,调度动作是可以与依赖项分离的逻辑的一部分(如果可能的话)。

想想一个有很多依赖和很多动作的类。这有助于将事物分开。每个将阅读该类的人都可以随时查看构造函数以查看依赖项是什么,并且不会被任何其他逻辑混淆。

于 2017-11-02T09:15:12.443 回答