8

在 Angular-2 项目中始终使用是否是一个合理的约定?

changeDetection: ChangeDetectionStrategy.OnPush

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

4

4 回答 4

9

不,我不建议这样做。

Angular 2 变化检测非常快。如果你有一个小项目,我不会费心使用它。

如果您有一个大型项目,我可能只会OnPush在某些“叶”组件上使用——叶组件具有仅依赖于输入属性的视图绑定。(“叶子”组件没有子组件。)

请注意,OnPush可以防止子组件被自动检测更改,因为如果没有任何原因导致OnPush组件被检测到更改,则也不会检查其子组件。因此,我通常只在叶子组件上使用它,以避免这个可能的问题。

另请注意,如果您将 JavaScript 引用类型用于输入属性,OnPush则不会检测到您对这些引用类型的属性所做的更改(例如,如果您从数组中添加或删除元素,或者如果您修改了对象属性的值。)

于 2016-09-13T14:56:25.187 回答
7

特别是对于大型项目,答案是YES并且始终建议在创建新组件时将其作为第一件事添加。

原因很简单:减少变更检测过程是一项非常昂贵的操作。

有很多方法可以在需要时启动检测,也许最常用的是changeDetection()ChangeDetectorRef. async如果您正在等待订阅值,另一种方法是在视图中使用管道。

要在终端中OnPush运行命令时自动添加策略ng generate component,您只需在您angular.jsonschematics节点中添加选项:

...

    "schematics": {
        "@schematics/angular:component": {
            "changeDetection": "OnPush",
            "prefix": "app",
            "styleext": "scss"
        },
        "@schematics/angular:directive": {
            "prefix": "app"
        }
    }
...
于 2019-12-03T13:06:56.287 回答
0

不。

为什么?不是因为默认的变更检测策略更好。但是因为从它切换到 OnPush 可能很麻烦且影响很大。如果您使用任何不使用 OnPush 的 3rd 方应用程序,您也可能会遇到一些问题。

我只是不明白为什么很多人都加入了默认的更改检测策略潮流并推荐它。在我看来,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")); 
    }
}
于 2019-09-05T10:21:21.560 回答
-2

您可以使用immutable.js来“冻结”所有对象并且不允许修改,如果您想全局使用 OnPush,这将是一条更安全的路线,以防止组件绑定中的错误

于 2017-12-14T13:43:49.620 回答