您是否会推荐ChangeDetectionStrategy.OnPush作为Angular 2中的默认changeDetection?

Mar*_*mer 5 angular2-changedetection angular

始终使用Angular-2项目是合理的约定吗

changeDetection: ChangeDetectionStrategy.OnPush
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*cok 9

不,我不建议这样做。

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

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

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

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

  • 我还认为您需要很好地理解更改检测才能正确使用“OnPush”,但我认为这是它不是默认设置的唯一原因。除了 AFAIK,Angular2 团队还推荐使用“OnPush”,因为它使应用程序更快。不过,我不建议从 `OnPush` 开始,当你开始你的第一个 Angular2 项目时,只有在你对 Angular2 的工作原理有了一些很好的理解之后。 (4认同)
  • 为什么它不是叶子组件时会出现问题?这不是“OnPush”修剪需要运行更改检测的树的全部目的吗? (2认同)
  • “因为它使应用程序更快” - 但它需要很快吗?或者完全没问题吗?打开 chrome 分析器,然后再回来做出决定。OnPush 过多是过早优化的症状。 (2认同)

Fer*_*rie 9

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

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

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

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

...

    "schematics": {
        "@schematics/angular:component": {
            "changeDetection": "OnPush",
            "prefix": "app",
            "styleext": "scss"
        },
        "@schematics/angular:directive": {
            "prefix": "app"
        }
    }
...
Run Code Online (Sandbox Code Playgroud)