你会推荐ChangeDetectionStrategy.OnPush作为Angular 2中的默认changeDetection吗?

时间:2016-09-13 13:23:28

标签: angular angular2-changedetection

在Angular-2项目中,始终使用

是一个合理的约定
changeDetection: ChangeDetectionStrategy.OnPush

在组件的装饰器中?除非有明确的理由使用默认策略?

4 个答案:

答案 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")); 
    }
}