您会推荐 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"
        }
    }
...