@@ -40,6 +40,7 @@ var CHANGES_LOCAL = "changes";
4040var LOCALS_ACCESSOR = "this.locals" ;
4141var MODE_ACCESSOR = "this.mode" ;
4242var CURRENT_PROTO = "currentProto" ;
43+ var ALREADY_CHECKED_ACCESSOR = "this.alreadyChecked" ;
4344
4445
4546export class ChangeDetectorJITGenerator {
@@ -86,6 +87,7 @@ export class ChangeDetectorJITGenerator {
8687 ${ PROTOS_ACCESSOR } = protos;
8788 ${ DIRECTIVES_ACCESSOR } = directiveRecords;
8889 ${ LOCALS_ACCESSOR } = null;
90+ ${ ALREADY_CHECKED_ACCESSOR } = false;
8991 ${ this . _genFieldDefinitions ( ) }
9092 }
9193
@@ -101,6 +103,8 @@ export class ChangeDetectorJITGenerator {
101103 context = ${ CONTEXT_ACCESSOR } ;
102104
103105 ${ this . records . map ( ( r ) => this . _genRecord ( r ) ) . join ( "\n" ) }
106+
107+ ${ ALREADY_CHECKED_ACCESSOR } = true;
104108 }
105109
106110 ${ this . typeName } .prototype.callOnAllChangesDone = function() {
@@ -113,6 +117,7 @@ export class ChangeDetectorJITGenerator {
113117 ${ LOCALS_ACCESSOR } = locals;
114118 ${ this . _genHydrateDirectives ( ) }
115119 ${ this . _genHydrateDetectors ( ) }
120+ ${ ALREADY_CHECKED_ACCESSOR } = false;
116121 }
117122
118123 ${ this . typeName } .prototype.dehydrate = function() {
@@ -136,7 +141,7 @@ export class ChangeDetectorJITGenerator {
136141 }
137142
138143 _genGetDirectiveFieldNames ( ) : List < string > {
139- return this . directiveRecords . map ( ( d ) => this . _genGetDirective ( d . directiveIndex ) ) ;
144+ return this . directiveRecords . map ( d => this . _genGetDirective ( d . directiveIndex ) ) ;
140145 }
141146
142147 _genGetDetectorFieldNames ( ) : List < string > {
@@ -212,10 +217,26 @@ export class ChangeDetectorJITGenerator {
212217 }
213218
214219 _genRecord ( r : ProtoRecord ) : string {
215- if ( r . mode === RECORD_TYPE_PIPE || r . mode === RECORD_TYPE_BINDING_PIPE ) {
216- return this . _genPipeCheck ( r ) ;
220+ var rec ;
221+ if ( r . isLifeCycleRecord ( ) ) {
222+ rec = this . _genDirectiveLifecycle ( r ) ;
223+ } else if ( r . isPipeRecord ( ) ) {
224+ rec = this . _genPipeCheck ( r ) ;
217225 } else {
218- return this . _genReferenceCheck ( r ) ;
226+ rec = this . _genReferenceCheck ( r ) ;
227+ }
228+ return `${ rec } ${ this . _genLastInDirective ( r ) } ` ;
229+ }
230+
231+ _genDirectiveLifecycle ( r : ProtoRecord ) {
232+ if ( r . name === "onCheck" ) {
233+ return this . _genOnCheck ( r ) ;
234+ } else if ( r . name === "onInit" ) {
235+ return this . _genOnInit ( r ) ;
236+ } else if ( r . name === "onChange" ) {
237+ return this . _genOnChange ( r ) ;
238+ } else {
239+ throw new BaseException ( `Unknown lifecycle event '${ r . name } '` ) ;
219240 }
220241 }
221242
@@ -248,7 +269,6 @@ export class ChangeDetectorJITGenerator {
248269 ${ this . _genAddToChanges ( r ) }
249270 ${ oldValue } = ${ newValue } ;
250271 }
251- ${ this . _genLastInDirective ( r ) }
252272 ` ;
253273 }
254274
@@ -266,7 +286,6 @@ export class ChangeDetectorJITGenerator {
266286 ${ this . _genAddToChanges ( r ) }
267287 ${ oldValue } = ${ newValue } ;
268288 }
269- ${ this . _genLastInDirective ( r ) }
270289 ` ;
271290
272291 if ( r . isPureFunction ( ) ) {
@@ -390,22 +409,27 @@ export class ChangeDetectorJITGenerator {
390409 }
391410
392411 _genLastInDirective ( r : ProtoRecord ) : string {
412+ if ( ! r . lastInDirective ) return "" ;
393413 return `
394- ${ this . _genNotifyOnChanges ( r ) }
414+ ${ CHANGES_LOCAL } = null;
395415 ${ this . _genNotifyOnPushDetectors ( r ) }
396416 ${ IS_CHANGED_LOCAL } = false;
397417 ` ;
398418 }
399419
400- _genNotifyOnChanges ( r : ProtoRecord ) : string {
420+ _genOnCheck ( r : ProtoRecord ) : string {
401421 var br = r . bindingRecord ;
402- if ( ! r . lastInDirective || ! br . callOnChange ( ) ) return "" ;
403- return `
404- if(${ CHANGES_LOCAL } ) {
405- ${ this . _genGetDirective ( br . directiveRecord . directiveIndex ) } .onChange(${ CHANGES_LOCAL } );
406- ${ CHANGES_LOCAL } = null;
407- }
408- ` ;
422+ return `if (!throwOnChange) ${ this . _genGetDirective ( br . directiveRecord . directiveIndex ) } .onCheck();` ;
423+ }
424+
425+ _genOnInit ( r : ProtoRecord ) : string {
426+ var br = r . bindingRecord ;
427+ return `if (!throwOnChange && !${ ALREADY_CHECKED_ACCESSOR } ) ${ this . _genGetDirective ( br . directiveRecord . directiveIndex ) } .onInit();` ;
428+ }
429+
430+ _genOnChange ( r : ProtoRecord ) : string {
431+ var br = r . bindingRecord ;
432+ return `if (!throwOnChange && ${ CHANGES_LOCAL } ) ${ this . _genGetDirective ( br . directiveRecord . directiveIndex ) } .onChange(${ CHANGES_LOCAL } );` ;
409433 }
410434
411435 _genNotifyOnPushDetectors ( r : ProtoRecord ) : string {
0 commit comments