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