fix(ivy): account for multiple changes between change detection runs (#24152)
PR Close #24152
This commit is contained in:
parent
a5c47d0045
commit
2d9111bfb6
|
@ -272,7 +272,13 @@ export function NgOnChangesFeature(inputPropertyNames?: {[key: string]: string})
|
||||||
this, PRIVATE_PREFIX, {value: simpleChanges = {}, writable: true});
|
this, PRIVATE_PREFIX, {value: simpleChanges = {}, writable: true});
|
||||||
}
|
}
|
||||||
const isFirstChange = !this.hasOwnProperty(privateMinKey);
|
const isFirstChange = !this.hasOwnProperty(privateMinKey);
|
||||||
simpleChanges[propertyName] = new SimpleChange(this[privateMinKey], value, isFirstChange);
|
const currentChange: SimpleChange|undefined = simpleChanges[propertyName];
|
||||||
|
if (currentChange) {
|
||||||
|
currentChange.currentValue = value;
|
||||||
|
} else {
|
||||||
|
simpleChanges[propertyName] =
|
||||||
|
new SimpleChange(this[privateMinKey], value, isFirstChange);
|
||||||
|
}
|
||||||
if (isFirstChange) {
|
if (isFirstChange) {
|
||||||
// Create a place where the actual value will be stored and make it non-enumerable
|
// Create a place where the actual value will be stored and make it non-enumerable
|
||||||
Object.defineProperty(this, privateMinKey, {value, writable: true});
|
Object.defineProperty(this, privateMinKey, {value, writable: true});
|
||||||
|
|
|
@ -45,7 +45,7 @@ describe('define', () => {
|
||||||
expect(myDir.valB).toEqual('works');
|
expect(myDir.valB).toEqual('works');
|
||||||
myDir.log.length = 0;
|
myDir.log.length = 0;
|
||||||
(MyDirective.ngDirectiveDef as DirectiveDef<MyDirective>).doCheck !.call(myDir);
|
(MyDirective.ngDirectiveDef as DirectiveDef<MyDirective>).doCheck !.call(myDir);
|
||||||
const changeA = new SimpleChange('initValue', 'first', false);
|
const changeA = new SimpleChange(undefined, 'first', true);
|
||||||
const changeB = new SimpleChange(undefined, 'second', true);
|
const changeB = new SimpleChange(undefined, 'second', true);
|
||||||
expect(myDir.log).toEqual(['ngOnChanges', 'valA', changeA, 'valB', changeB, 'ngDoCheck']);
|
expect(myDir.log).toEqual(['ngOnChanges', 'valA', changeA, 'valB', changeB, 'ngDoCheck']);
|
||||||
});
|
});
|
||||||
|
@ -75,7 +75,7 @@ describe('define', () => {
|
||||||
myDir.valA = 'first';
|
myDir.valA = 'first';
|
||||||
myDir.valB = 'second';
|
myDir.valB = 'second';
|
||||||
(MyDirective.ngDirectiveDef as DirectiveDef<MyDirective>).doCheck !.call(myDir);
|
(MyDirective.ngDirectiveDef as DirectiveDef<MyDirective>).doCheck !.call(myDir);
|
||||||
const changeA1 = new SimpleChange('initValue', 'first', false);
|
const changeA1 = new SimpleChange(undefined, 'first', true);
|
||||||
const changeB1 = new SimpleChange(undefined, 'second', true);
|
const changeB1 = new SimpleChange(undefined, 'second', true);
|
||||||
expect(myDir.log).toEqual(['valA', changeA1, 'valB', changeB1]);
|
expect(myDir.log).toEqual(['valA', changeA1, 'valB', changeB1]);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue