@@ -7,6 +7,7 @@ import 'package:angular2/src/change_detection/directive_record.dart';
77import 'package:angular2/src/change_detection/interfaces.dart' ;
88import 'package:angular2/src/change_detection/proto_change_detector.dart' ;
99import 'package:angular2/src/change_detection/proto_record.dart' ;
10+ import 'package:angular2/src/facade/lang.dart' show BaseException;
1011
1112/// Responsible for generating change detector classes for Angular 2.
1213///
@@ -99,6 +100,7 @@ class _CodegenState {
99100 final $_GEN_PREFIX .List<$_GEN_PREFIX .DirectiveRecord>
100101 $_DIRECTIVES_ACCESSOR ;
101102 dynamic $_LOCALS_ACCESSOR = null;
103+ dynamic $_ALREADY_CHECKED_ACCESSOR = false;
102104 ${_allFields ().map ((f ) {
103105 if (f == _CONTEXT_ACCESSOR ) {
104106 return '$_contextTypeName $f = null;' ;
@@ -124,6 +126,8 @@ class _CodegenState {
124126
125127 context = $_CONTEXT_ACCESSOR ;
126128 ${_records .map (_genRecord ).join ('' )}
129+
130+ $_ALREADY_CHECKED_ACCESSOR = true;
127131 }
128132
129133 void callOnAllChangesDone() {
@@ -136,6 +140,7 @@ class _CodegenState {
136140 $_LOCALS_ACCESSOR = locals;
137141 ${_genHydrateDirectives ()}
138142 ${_genHydrateDetectors ()}
143+ $_ALREADY_CHECKED_ACCESSOR = false;
139144 }
140145
141146 void dehydrate() {
@@ -234,10 +239,26 @@ class _CodegenState {
234239 _changeNames.map ((name) => 'var $name = false;' ).join ('' );
235240
236241 String _genRecord (ProtoRecord r) {
237- if (r.mode == RECORD_TYPE_PIPE || r.mode == RECORD_TYPE_BINDING_PIPE ) {
238- return _genPipeCheck (r);
242+ var rec = null ;
243+ if (r.isLifeCycleRecord ()) {
244+ rec = _genDirectiveLifecycle (r);
245+ } else if (r.isPipeRecord ()) {
246+ rec = _genPipeCheck (r);
239247 } else {
240- return _genReferenceCheck (r);
248+ rec = _genReferenceCheck (r);
249+ }
250+ return '$rec ${_maybeGenLastInDirective (r )}' ;
251+ }
252+
253+ String _genDirectiveLifecycle (ProtoRecord r) {
254+ if (r.name == 'onCheck' ) {
255+ return _genOnCheck (r);
256+ } else if (r.name == 'onInit' ) {
257+ return _genOnInit (r);
258+ } else if (r.name == 'onChange' ) {
259+ return _genOnChange (r);
260+ } else {
261+ throw new BaseException ("Unknown lifecycle event '${r .name }'" );
241262 }
242263 }
243264
@@ -269,7 +290,6 @@ class _CodegenState {
269290 ${_genAddToChanges (r )}
270291 $oldValue = $newValue ;
271292 }
272- ${_genLastInDirective (r )}
273293 ''' ;
274294 }
275295
@@ -287,7 +307,6 @@ class _CodegenState {
287307 ${_genAddToChanges (r )}
288308 $oldValue = $newValue ;
289309 }
290- ${_genLastInDirective (r )}
291310 ''' ;
292311 if (r.isPureFunction ()) {
293312 // Add an "if changed guard"
@@ -414,24 +433,32 @@ class _CodegenState {
414433 ''' ;
415434 }
416435
417- String _genLastInDirective (ProtoRecord r) {
436+ String _maybeGenLastInDirective (ProtoRecord r) {
437+ if (! r.lastInDirective) return '' ;
418438 return '''
419- ${ _genNotifyOnChanges ( r )}
439+ $_CHANGES_LOCAL = null;
420440 ${_genNotifyOnPushDetectors (r )}
421441 $_IS_CHANGED_LOCAL = false;
422442 ''' ;
423443 }
424444
425- String _genNotifyOnChanges (ProtoRecord r) {
445+ String _genOnCheck (ProtoRecord r) {
426446 var br = r.bindingRecord;
427- if (! r.lastInDirective || ! br.callOnChange ()) return '' ;
428- return '''
429- if($_CHANGES_LOCAL ) {
430- ${_genGetDirective (br .directiveRecord .directiveIndex )}
431- .onChange($_CHANGES_LOCAL );
432- $_CHANGES_LOCAL = null;
433- }
434- ''' ;
447+ return 'if (!throwOnChange) '
448+ '${_genGetDirective (br .directiveRecord .directiveIndex )}.onCheck();' ;
449+ }
450+
451+ String _genOnInit (ProtoRecord r) {
452+ var br = r.bindingRecord;
453+ return 'if (!throwOnChange && !$_ALREADY_CHECKED_ACCESSOR ) '
454+ '${_genGetDirective (br .directiveRecord .directiveIndex )}.onInit();' ;
455+ }
456+
457+ String _genOnChange (ProtoRecord r) {
458+ var br = r.bindingRecord;
459+ return 'if (!throwOnChange && $_CHANGES_LOCAL != null) '
460+ '${_genGetDirective (br .directiveRecord .directiveIndex )}'
461+ '.onChange($_CHANGES_LOCAL );' ;
435462 }
436463
437464 String _genNotifyOnPushDetectors (ProtoRecord r) {
@@ -447,6 +474,7 @@ class _CodegenState {
447474
448475const PROTO_CHANGE_DETECTOR_FACTORY_METHOD = 'newProtoChangeDetector' ;
449476
477+ const _ALREADY_CHECKED_ACCESSOR = '_alreadyChecked' ;
450478const _BASE_CLASS = '$_GEN_PREFIX .AbstractChangeDetector' ;
451479const _CHANGES_LOCAL = 'changes' ;
452480const _CONTEXT_ACCESSOR = '_context' ;
0 commit comments