perf(change_detection): do not generate onAllChangesDone when not needed

This commit is contained in:
vsavkin 2015-07-31 10:35:42 -07:00
parent dd06a871b7
commit adc27398fd
5 changed files with 29 additions and 27 deletions

View File

@ -135,7 +135,7 @@ export class AbstractChangeDetector<T> implements ChangeDetector {
hydrated(): boolean { return this.context !== null; }
callOnAllChangesDone(): void {}
callOnAllChangesDone(): void { this.dispatcher.notifyOnAllChangesDone(); }
_detectChangesInLightDomChildren(throwOnChange: boolean): void {
var c = this.lightDomChildren;

View File

@ -57,9 +57,7 @@ export class ChangeDetectorJITGenerator {
${this._genCheckNoChanges()}
${this._typeName}.prototype.callOnAllChangesDone = function() {
${this._genCallOnAllChangesDoneBody()}
}
${this._maybeGenCallOnAllChangesDone()}
${this._maybeGenHydrateDirectives()}
@ -117,7 +115,7 @@ export class ChangeDetectorJITGenerator {
return lines.join('\n');
}
_genCallOnAllChangesDoneBody(): string {
_maybeGenCallOnAllChangesDone(): string {
var notifications = [];
var dirs = this.directiveRecords;
@ -129,13 +127,17 @@ export class ChangeDetectorJITGenerator {
`${this._names.getDirectiveName(dir.directiveIndex)}.onAllChangesDone();`);
}
}
if (notifications.length > 0) {
var directiveNotifications = notifications.join("\n");
return `
${this._names.getDispatcherName()}.notifyOnAllChangesDone();
${this._typeName}.prototype.callOnAllChangesDone = function() {
${ABSTRACT_CHANGE_DETECTOR}.prototype.callOnAllChangesDone.call(this);
${directiveNotifications}
}
`;
} else {
return '';
}
}
_genRecord(r: ProtoRecord): string {

View File

@ -106,7 +106,7 @@ export class DynamicChangeDetector extends AbstractChangeDetector<any> {
}
callOnAllChangesDone() {
this.dispatcher.notifyOnAllChangesDone();
super.callOnAllChangesDone();
var dirs = this.directiveRecords;
for (var i = dirs.length - 1; i >= 0; --i) {
var dir = dirs[i];

View File

@ -120,9 +120,7 @@ class _CodegenState {
${_genCheckNoChanges()}
void callOnAllChangesDone() {
${_getCallOnAllChangesDoneBody()}
}
${_maybeGenCallOnAllChangesDone()}
${_maybeGenHydrateDirectives()}
@ -190,17 +188,23 @@ class _CodegenState {
/// Generates calls to `onAllChangesDone` for all `Directive`s that request
/// them.
String _getCallOnAllChangesDoneBody() {
String _maybeGenCallOnAllChangesDone() {
// NOTE(kegluneq): Order is important!
var directiveNotifications = _directiveRecords.reversed
.where((rec) => rec.callOnAllChangesDone)
.map((rec) =>
'${_names.getDirectiveName(rec.directiveIndex)}.onAllChangesDone();')
.join('');
'${_names.getDirectiveName(rec.directiveIndex)}.onAllChangesDone();');
if (directiveNotifications.isNotEmpty) {
return '''
void callOnAllChangesDone() {
${_names.getDispatcherName()}.notifyOnAllChangesDone();
${directiveNotifications}
${directiveNotifications.join('')}
}
''';
} else {
return '';
}
}
String _genDeclareFields() {

View File

@ -73,10 +73,6 @@ class _MyComponent_ChangeDetector0
runDetectChanges(true);
}
void callOnAllChangesDone() {
this.dispatcher.notifyOnAllChangesDone();
}
void dehydrateDirectives(destroyPipes) {
this.myNum0 = this.interpolate1 = _gen.ChangeDetectionUtil.uninitialized;
}