X Tutup
Skip to content

Commit 17c6d6a

Browse files
author
Tim Blasi
committed
feat(dart/transform): Add onInit and onCheck hooks in Dart
Implement `onInit` and `onCheck` hooks in pre-generated Dart change detectors. This mirrors the changes made to the JIT change detector in c39c8eb.
1 parent 633cf63 commit 17c6d6a

File tree

3 files changed

+51
-18
lines changed

3 files changed

+51
-18
lines changed

modules/angular2/src/change_detection/change_detection_jit_generator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ export class ChangeDetectorJITGenerator {
236236
} else {
237237
rec = this._genReferenceCheck(r);
238238
}
239-
return `${rec}${this._genLastInDirective(r)}`;
239+
return `${rec}${this._maybeGenLastInDirective(r)}`;
240240
}
241241

242242
_genDirectiveLifecycle(r: ProtoRecord) {
@@ -419,7 +419,7 @@ export class ChangeDetectorJITGenerator {
419419
`;
420420
}
421421

422-
_genLastInDirective(r: ProtoRecord): string {
422+
_maybeGenLastInDirective(r: ProtoRecord): string {
423423
if (!r.lastInDirective) return "";
424424
return `
425425
${CHANGES_LOCAL} = null;

modules/angular2/src/transform/template_compiler/change_detector_codegen.dart

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:angular2/src/change_detection/directive_record.dart';
77
import 'package:angular2/src/change_detection/interfaces.dart';
88
import 'package:angular2/src/change_detection/proto_change_detector.dart';
99
import '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

448475
const PROTO_CHANGE_DETECTOR_FACTORY_METHOD = 'newProtoChangeDetector';
449476

477+
const _ALREADY_CHECKED_ACCESSOR = '_alreadyChecked';
450478
const _BASE_CLASS = '$_GEN_PREFIX.AbstractChangeDetector';
451479
const _CHANGES_LOCAL = 'changes';
452480
const _CONTEXT_ACCESSOR = '_context';

modules/angular2/test/transform/integration/two_annotations_files/expected/bar.ng_deps.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class _MyComponent_ChangeDetector0 extends _gen.AbstractChangeDetector {
2727
final _gen.List<_gen.ProtoRecord> _protos;
2828
final _gen.List<_gen.DirectiveRecord> _directiveRecords;
2929
dynamic _locals = null;
30+
dynamic _alreadyChecked = false;
3031
MyComponent _context = null;
3132

3233
_MyComponent_ChangeDetector0(this._dispatcher, this._pipeRegistry,
@@ -44,6 +45,8 @@ class _MyComponent_ChangeDetector0 extends _gen.AbstractChangeDetector {
4445
var changes = null;
4546

4647
context = _context;
48+
49+
_alreadyChecked = true;
4750
}
4851

4952
void callOnAllChangesDone() {}
@@ -52,6 +55,8 @@ class _MyComponent_ChangeDetector0 extends _gen.AbstractChangeDetector {
5255
mode = 'ALWAYS_CHECK';
5356
_context = context;
5457
_locals = locals;
58+
59+
_alreadyChecked = false;
5560
}
5661

5762
void dehydrate() {

0 commit comments

Comments
 (0)
X Tutup