在Angular-2项目中,始终使用
是一个合理的约定changeDetection: ChangeDetectionStrategy.OnPush
在组件的装饰器中?除非有明确的理由使用默认策略?
答案 0 :(得分:1)
不,我不推荐。
Angular 2变化检测非常快。如果你有一个小项目,我不会打扰使用它。
如果你有一个大型项目,我可能只对某些“叶子”组件使用OnPush
- 具有仅取决于输入属性的视图绑定的叶子组件。 (“leaf”组件没有子组件。)
请注意OnPush
可以防止子组件被自动更改检测到,因为如果没有caused the OnPush
component to be change detected,则不会检查其子组件。因此我通常只在叶子组件上使用它,以避免这个可能的问题。
另外要注意,如果您对输入属性使用JavaScript引用类型,OnPush
将不会检测您对这些引用类型的属性所做的更改(例如,如果您从数组中添加或删除元素,或者修改对象属性的值。)
答案 1 :(得分:1)
特别是对于大型项目,答案是YES
,在创建新组件时,始终建议先将其添加。
原因很简单:减少变更检测过程是非常昂贵的操作。
有许多方法可以在需要时启动检测,也许最常用的方法是从changeDetection()
手动触发ChangeDetectorRef
。另一种方法是,如果您正在等待订阅值,请在视图中使用async
管道。
要在终端中运行OnPush
命令时自动添加ng generate component
策略,只需在angular.json
节点的schematics
中添加选项:< / p>
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...
答案 2 :(得分:0)
您可以使用immutable.js来冻结&#39;所有对象都不允许修改,如果你想全局使用OnPush,这将是一个更安全的路由,以防止组件绑定错误
答案 3 :(得分:-1)
不。
为什么?不是因为默认的更改检测策略更好。但是因为从它切换到OnPush既麻烦又有影响力。如果您使用的是不使用OnPush的任何第三方应用程序,那么您也可能会遇到一些问题。
我不明白为什么很多人都加入默认变更检测策略潮流并推荐它。在我看来,angular应该始终只有一个选择-OnPush。 这不是什么新鲜事。 Silverlight / WPF通过INotifyPropertyChanged
完成此操作public string UserName
{
get { return this.username; }
set
{
this.username = value;
// tell the UI that this UI bound property has been changed and that it is time to update the UI
PropertyChanged(this, new PropertyChangedEventArgs("UserName"));
}
}