Angular 策略OnPush意味着什么?

Angular 策略OnPush意味着什么?,angular,angular2-changedetection,Angular,Angular2 Changedetection,我对Angular2不熟悉打字。我目前正在从事一个项目,不幸的是,我无法理解OnPush的功能: changeDetection:ChangeDetectionStrategy.OnPush 我找了很多,但没有找到正确的答案 有人能给我解释一下吗?这个例子是值得赞赏的 On push change detection(推送更改检测)意味着仅当输入更改时才运行组件上的更改检测,并且当输入更改时,其整个对象必须更改。这意味着,如果只有引用更改,则不会运行更改检测 例如,如果组件上有一个数组输入: @

我对Angular2不熟悉打字。我目前正在从事一个项目,不幸的是,我无法理解OnPush的功能:

changeDetection:ChangeDetectionStrategy.OnPush

我找了很多,但没有找到正确的答案


有人能给我解释一下吗?这个例子是值得赞赏的

On push change detection(推送更改检测)意味着仅当输入更改时才运行组件上的更改检测,并且当输入更改时,其整个对象必须更改。这意味着,如果只有引用更改,则不会运行更改检测

例如,如果组件上有一个数组输入:

@Input() testArray: Item[] = [];
如果在父组件中使用
push
修改该数组,则更改检测将不会在子组件上运行。但如果你这样做:

array = [...array, newItem];

<test-component [testArray]="array"></test-component>
array=[…array,newItem];

将运行更改检测。这用于提高应用程序性能,因为它大大减少了更改检测的运行次数。它通常与不可变的数据结构配对,尤其是
存储
Redux
模式,例如
@ngrx/store

推式更改检测意味着只有当输入更改时,组件上的更改检测才会运行,当输入更改时,其整个对象必须更改。这意味着,如果只有引用更改,则不会运行更改检测

例如,如果组件上有一个数组输入:

@Input() testArray: Item[] = [];
如果在父组件中使用
push
修改该数组,则更改检测将不会在子组件上运行。但如果你这样做:

array = [...array, newItem];

<test-component [testArray]="array"></test-component>
array=[…array,newItem];

将运行更改检测。这用于提高应用程序性能,因为它大大减少了更改检测的运行次数。它通常与不可变的数据结构配对,尤其是
存储
模式,如
@ngrx/store

,我认为通过一个例子更容易理解:

您有一个具有输入属性的组件:

type Person {
  name: string;
  surname: string;
}
@Component({
    selector: 'my-component',
    changeDetection: ChangeDetectionStrategy.OnPush,
    template: `<p> {{person.name}} {{person.surname}} </p>`
})
class myComponent {
  ...
  @Input() person: Person;
  ...
}
Angular不会检测到这种变化,因为它认为对象本身是相同的。您已经更改了对象的属性,而不是对象本身。您需要更改整个对象(参考)以使其具有角度以检测此更改:

person={name:'changed',surname:'something else'};

因此,就像angular将输入元素视为不可变对象,它们内部的任何更改都将被忽略。

我认为通过一个示例更容易理解:

您有一个具有输入属性的组件:

type Person {
  name: string;
  surname: string;
}
@Component({
    selector: 'my-component',
    changeDetection: ChangeDetectionStrategy.OnPush,
    template: `<p> {{person.name}} {{person.surname}} </p>`
})
class myComponent {
  ...
  @Input() person: Person;
  ...
}
Angular不会检测到这种变化,因为它认为对象本身是相同的。您已经更改了对象的属性,而不是对象本身。您需要更改整个对象(参考)以使其具有角度以检测此更改:

person={name:'changed',surname:'something else'};

因此,这就像angular将输入元素视为不可变对象,它们内部的任何更改都将被忽略。

这不是整个对象的问题,而是更改来自
@input()
属性的父级。“这意味着,如果只有引用改变”,即使你改变了“整个对象”,这也是引用的改变。谢谢。我想这是一个很好的描述。因此,我必须将其写在子组件(期望值的组件)上,对吗?@SamySammour如果应用OnPush检测,您的组件应该遵循智能/哑原则。这意味着所有事情,如获取数据、修改数据,都应该在智能组件中完成,而哑组件只应该用于演示。这意味着您的子组件应该只有一个输入(如上所述),任何修改都应该按照我向您展示的方式在父组件中完成。@Matsura,非常清楚。非常感谢。我真的明白为什么我的组件会这样反应。这不是整个对象的问题,而是更改来自
@Input()
属性的父对象。“这意味着,如果只有引用改变”,即使你改变了“整个对象”,这也是引用的改变。谢谢。我想这是一个很好的描述。因此,我必须将其写在子组件(期望值的组件)上,对吗?@SamySammour如果应用OnPush检测,您的组件应该遵循智能/哑原则。这意味着所有事情,如获取数据、修改数据,都应该在智能组件中完成,而哑组件只应该用于演示。这意味着您的子组件应该只有一个输入(如上所述),任何修改都应该按照我向您展示的方式在父组件中完成。@Matsura,非常清楚。非常感谢。我真的明白为什么我的组件会以这种方式反应。可能的重复