fix(ivy): account for multiple changes between change detection runs (#24152)

PR Close #24152
This commit is contained in:
JoostK 2018-05-27 15:26:41 +02:00 committed by Victor Berchet
parent a5c47d0045
commit 2d9111bfb6
2 changed files with 9 additions and 3 deletions

View File

@ -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});

View File

@ -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]);