fix(ivy): remove unnecessary parameter of NgOnChangesFeature (#21879)

PR Close #21879
This commit is contained in:
Chuck Jazdzewski 2018-01-29 15:57:58 -08:00 committed by Alex Rickabaugh
parent 8b14488827
commit 65cf1add97
4 changed files with 50 additions and 52 deletions

View File

@ -67,59 +67,57 @@ type OnChangesExpando = OnChanges & {
[key: string]: any; [key: string]: any;
}; };
export function NgOnChangesFeature<T>(type: Type<T>): (definition: DirectiveDef<any>) => void { export function NgOnChangesFeature(definition: DirectiveDef<any>): void {
return function(definition: DirectiveDef<any>): void { const inputs = definition.inputs;
const inputs = definition.inputs; const proto = definition.type.prototype;
const proto = type.prototype; // Place where we will store SimpleChanges if there is a change
// Place where we will store SimpleChanges if there is a change Object.defineProperty(proto, PRIVATE_PREFIX, {value: undefined, writable: true});
Object.defineProperty(proto, PRIVATE_PREFIX, {value: undefined, writable: true}); for (let pubKey in inputs) {
for (let pubKey in inputs) { const minKey = inputs[pubKey];
const minKey = inputs[pubKey]; const privateMinKey = PRIVATE_PREFIX + minKey;
const privateMinKey = PRIVATE_PREFIX + minKey; // 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(proto, privateMinKey, {value: undefined, writable: true});
Object.defineProperty(proto, privateMinKey, {value: undefined, writable: true});
const existingDesc = Object.getOwnPropertyDescriptor(proto, minKey); const existingDesc = Object.getOwnPropertyDescriptor(proto, minKey);
// create a getter and setter for property // create a getter and setter for property
Object.defineProperty(proto, minKey, { Object.defineProperty(proto, minKey, {
get: function(this: OnChangesExpando) { get: function(this: OnChangesExpando) {
return (existingDesc && existingDesc.get) ? existingDesc.get.call(this) : return (existingDesc && existingDesc.get) ? existingDesc.get.call(this) :
this[privateMinKey]; this[privateMinKey];
}, },
set: function(this: OnChangesExpando, value: any) { set: function(this: OnChangesExpando, value: any) {
let simpleChanges = this[PRIVATE_PREFIX];
let isFirstChange = simpleChanges === undefined;
if (simpleChanges == null) {
simpleChanges = this[PRIVATE_PREFIX] = {};
}
simpleChanges[pubKey] = new SimpleChange(this[privateMinKey], value, isFirstChange);
(existingDesc && existingDesc.set) ? existingDesc.set.call(this, value) :
this[privateMinKey] = value;
}
});
}
// If an onInit hook is defined, it will need to wrap the ngOnChanges call
// so the call order is changes-init-check in creation mode. In subsequent
// change detection runs, only the check wrapper will be called.
if (definition.onInit != null) {
definition.onInit = onChangesWrapper(definition.onInit);
}
definition.doCheck = onChangesWrapper(definition.doCheck);
function onChangesWrapper(delegateHook: (() => void) | null) {
return function(this: OnChangesExpando) {
let simpleChanges = this[PRIVATE_PREFIX]; let simpleChanges = this[PRIVATE_PREFIX];
if (simpleChanges != null) { let isFirstChange = simpleChanges === undefined;
this.ngOnChanges(simpleChanges); if (simpleChanges == null) {
this[PRIVATE_PREFIX] = null; simpleChanges = this[PRIVATE_PREFIX] = {};
} }
delegateHook && delegateHook.apply(this); simpleChanges[pubKey] = new SimpleChange(this[privateMinKey], value, isFirstChange);
}; (existingDesc && existingDesc.set) ? existingDesc.set.call(this, value) :
} this[privateMinKey] = value;
}; }
});
}
// If an onInit hook is defined, it will need to wrap the ngOnChanges call
// so the call order is changes-init-check in creation mode. In subsequent
// change detection runs, only the check wrapper will be called.
if (definition.onInit != null) {
definition.onInit = onChangesWrapper(definition.onInit);
}
definition.doCheck = onChangesWrapper(definition.doCheck);
function onChangesWrapper(delegateHook: (() => void) | null) {
return function(this: OnChangesExpando) {
let simpleChanges = this[PRIVATE_PREFIX];
if (simpleChanges != null) {
this.ngOnChanges(simpleChanges);
this[PRIVATE_PREFIX] = null;
}
delegateHook && delegateHook.apply(this);
};
}
} }

View File

@ -19,7 +19,7 @@ NgForOf.ngDirectiveDef = defineDirective({
factory: () => new NgForOfDef( factory: () => new NgForOfDef(
injectViewContainerRef(), injectTemplateRef(), injectViewContainerRef(), injectTemplateRef(),
inject(IterableDiffers, InjectFlags.Default, defaultIterableDiffers)), inject(IterableDiffers, InjectFlags.Default, defaultIterableDiffers)),
features: [NgOnChangesFeature(NgForOf)], features: [NgOnChangesFeature],
inputs: { inputs: {
ngForOf: 'ngForOf', ngForOf: 'ngForOf',
ngForTrackBy: 'ngForTrackBy', ngForTrackBy: 'ngForTrackBy',

View File

@ -426,7 +426,7 @@ describe('compiler specification', () => {
factory: () => new LifecycleComp(), factory: () => new LifecycleComp(),
template: function(ctx: any, cm: boolean) {}, template: function(ctx: any, cm: boolean) {},
inputs: {nameMin: 'name'}, inputs: {nameMin: 'name'},
features: [r3.NgOnChangesFeature(LifecycleComp)] features: [r3.NgOnChangesFeature]
}); });
} }

View File

@ -30,7 +30,7 @@ describe('define', () => {
static ngDirectiveDef = defineDirective({ static ngDirectiveDef = defineDirective({
type: MyDirective, type: MyDirective,
factory: () => new MyDirective(), factory: () => new MyDirective(),
features: [NgOnChangesFeature(MyDirective)], features: [NgOnChangesFeature],
inputs: {valA: 'valA', valB: 'valB'} inputs: {valA: 'valA', valB: 'valB'}
}); });
} }