您会推荐 ChangeDetectionStrategy.OnPush 作为 Angular 2 中的默认 changeDetection 吗?
Would you recommend ChangeDetectionStrategy.OnPush as default changeDetection in Angular 2?
在 Angular-2 项目中始终使用
是否合理?
changeDetection: ChangeDetectionStrategy.OnPush
在组件的装饰器中?除非有明确的理由使用默认策略?
不,我不推荐这样做。
Angular 2 变化检测非常快。如果你有一个小项目,我不会费心去使用它。
如果您有一个大型项目,我可能只会在某些 "leaf" 组件上使用 OnPush
-- 具有仅依赖于输入属性的视图绑定的叶组件。 ("leaf" 组件没有子组件。)
请注意 OnPush
可以防止子组件被自动检测到更改,因为如果没有 caused the OnPush
component to be change detected,其子组件的 none 也会被检查。因此我通常只在叶子组件上使用它,以避免这个可能的问题。
另请注意,如果您对输入属性使用 JavaScript 引用类型,OnPush
将不会检测您对这些引用类型的属性所做的更改(例如,如果您添加或删除元素来自数组,或者如果您修改对象 属性 的值。)
您可以使用 immutable.js,它会 'freeze' 您所有的对象并且不允许修改,如果您想全局使用 OnPush,这将是一个更安全的路线,以防止组件绑定中的错误
没有。
为什么?不是因为默认的变更检测策略更好。但是因为从它切换到 OnPush 会很麻烦并且影响很大。如果您使用任何不使用 OnPush 的第 3 方应用程序,您可能还会遇到一些问题。
我只是不明白为什么很多人加入默认更改检测策略的行列并推荐它。在我看来 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"));
}
}
特别是对于大项目,答案是YES
并且总是建议在创建新组件时首先添加它。
原因很简单:减少变化检测过程,这是一个非常昂贵的操作。
有很多方法可以在需要时启动检测,可能最常用的是从ChangeDetectorRef
手动触发changeDetection()
。如果您正在等待订阅值,另一种方法是在视图中使用 async
管道。
要在终端中 运行 ng generate component
命令时自动添加 OnPush
策略,您只需在 angular.json
中添加选项 schematics
节点:
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...
在 Angular-2 项目中始终使用
是否合理?changeDetection: ChangeDetectionStrategy.OnPush
在组件的装饰器中?除非有明确的理由使用默认策略?
不,我不推荐这样做。
Angular 2 变化检测非常快。如果你有一个小项目,我不会费心去使用它。
如果您有一个大型项目,我可能只会在某些 "leaf" 组件上使用 OnPush
-- 具有仅依赖于输入属性的视图绑定的叶组件。 ("leaf" 组件没有子组件。)
请注意 OnPush
可以防止子组件被自动检测到更改,因为如果没有 caused the OnPush
component to be change detected,其子组件的 none 也会被检查。因此我通常只在叶子组件上使用它,以避免这个可能的问题。
另请注意,如果您对输入属性使用 JavaScript 引用类型,OnPush
将不会检测您对这些引用类型的属性所做的更改(例如,如果您添加或删除元素来自数组,或者如果您修改对象 属性 的值。)
您可以使用 immutable.js,它会 'freeze' 您所有的对象并且不允许修改,如果您想全局使用 OnPush,这将是一个更安全的路线,以防止组件绑定中的错误
没有。
为什么?不是因为默认的变更检测策略更好。但是因为从它切换到 OnPush 会很麻烦并且影响很大。如果您使用任何不使用 OnPush 的第 3 方应用程序,您可能还会遇到一些问题。
我只是不明白为什么很多人加入默认更改检测策略的行列并推荐它。在我看来 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"));
}
}
特别是对于大项目,答案是YES
并且总是建议在创建新组件时首先添加它。
原因很简单:减少变化检测过程,这是一个非常昂贵的操作。
有很多方法可以在需要时启动检测,可能最常用的是从ChangeDetectorRef
手动触发changeDetection()
。如果您正在等待订阅值,另一种方法是在视图中使用 async
管道。
要在终端中 运行 ng generate component
命令时自动添加 OnPush
策略,您只需在 angular.json
中添加选项 schematics
节点:
...
"schematics": {
"@schematics/angular:component": {
"changeDetection": "OnPush",
"prefix": "app",
"styleext": "scss"
},
"@schematics/angular:directive": {
"prefix": "app"
}
}
...