Рассмотрим следующий код.
import {Component, OnInit, Input, OnChanges, DoCheck, ChangeDetectionStrategy} from 'angular2/core'
@Component({
selector: 'child1',
template: `
<div>reference change for entire object: {{my_obj1.name}}</div>
<div>reassign primitive in property of object: {{my_obj2.name}}</div>
<div>update primitive in property of object: {{my_obj2.num}}</div>
`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class Child1 {
@Input()
my_obj1: Object = {'name': ''};
@Input()
my_obj2: Object = {'name': '', 'num': 0};
ngDoCheck() {
console.log('check from child1');
console.log(this.my_obj1);
console.log(this.my_obj2);
}
}
@Component({
selector: 'parent',
template: `
<div>
<child1
[my_obj1]="my_obj1"
[my_obj2]="my_obj2"
>
</child1>
<button (click)="change_obj1()">
Change obj1
</button>
</div>
`,
directives: [Child1]
})
export class App {
my_obj1: Object = {'name': 'name1'};
my_obj2: Object = {'name': 'name2', 'num': 0};
change_obj1() {
this.my_obj1 = {'name': 'change1'}
this.my_obj2['name'] = 'change2';
this.my_obj2['num'] += 1;
}
}
Из эксперимента, который я провел, вот мое понимание текущей стратегии обнаружения изменений Angular2
, может ли кто-нибудь проверить, верно ли это?
Angular2 по умолчанию проверяет равенство значений при обнаружении изменений. Если
ChangeDetectionStrategy.OnPush
нет, каждая отслеживаемая переменная в дереве компонентов проверяется на равенство значений. Если равенство значений ложно, этот конкретный компонент будет перерисован, а если равенство значений истинно, этот конкретный компонент не будет перерисован.Если вы добавите
ChangeDetectionStrategy.OnPush
к компоненту. Поведение меняется следующим образомя. Если переменная внутри компонента имеет изменение ссылки, компонент перерисовывается, а дочерний компонент проверяется на обнаружение изменений (его конкретное значение алгоритма обнаружения изменений/проверка ссылки зависит от
ChangeDetectionStrategy.OnPush
)II. Если переменная внутри компонента не имеет ссылки на изменение, компонент не перерисовывается, и дочерний компонент не проверяется на обнаружение изменений, независимо от наличия
ChangeDetectionStrategy.OnPush
Это правильная интерпретация?