fix(ivy): remove unnecessary parameter of NgOnChangesFeature (#21879)
PR Close #21879
This commit is contained in:
parent
8b14488827
commit
65cf1add97
|
@ -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);
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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',
|
||||||
|
|
|
@ -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]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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'}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue