Skip to content

Commit f19970a

Browse files
committed
feat(transformers): added support for lifecycle events
1 parent 6f0631c commit f19970a

File tree

6 files changed

+95
-5
lines changed

6 files changed

+95
-5
lines changed

modules/angular2/src/render/dom/convert.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ export function directiveMetadataToMap(meta: DirectiveMetadata): Map<string, any
1818
['properties', _cloneIfPresent(meta.properties)],
1919
['readAttributes', _cloneIfPresent(meta.readAttributes)],
2020
['type', meta.type],
21-
['version', 1]
21+
['callOnDestroy', meta.callOnDestroy],
22+
['callOnCheck', meta.callOnCheck],
23+
['callOnInit', meta.callOnInit],
24+
['callOnChange', meta.callOnChange],
25+
['callOnAllChangesDone', meta.callOnAllChangesDone],
26+
['version', 1],
2227
]);
2328
}
2429

@@ -38,7 +43,12 @@ export function directiveMetadataFromMap(map: Map<string, any>): DirectiveMetada
3843
hostAttributes:<Map<string, string>>_cloneIfPresent(MapWrapper.get(map, 'hostAttributes')),
3944
properties:<List<string>>_cloneIfPresent(MapWrapper.get(map, 'properties')),
4045
readAttributes:<List<string>>_cloneIfPresent(MapWrapper.get(map, 'readAttributes')),
41-
type:<number>MapWrapper.get(map, 'type')
46+
type:<number>MapWrapper.get(map, 'type'),
47+
callOnDestroy:<boolean>MapWrapper.get(map, 'callOnDestroy'),
48+
callOnCheck:<boolean>MapWrapper.get(map, 'callOnCheck'),
49+
callOnChange:<boolean>MapWrapper.get(map, 'callOnChange'),
50+
callOnInit:<boolean>MapWrapper.get(map, 'callOnInit'),
51+
callOnAllChangesDone:<boolean>MapWrapper.get(map, 'callOnAllChangesDone')
4252
});
4353
}
4454

modules/angular2/src/transform/common/directive_metadata_reader.dart

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,13 @@ class _DirectiveMetadataVisitor extends Object
6060
hostListeners: {},
6161
hostProperties: {},
6262
hostAttributes: {},
63-
readAttributes: []);
63+
readAttributes: [],
64+
callOnDestroy: false,
65+
callOnChange: false,
66+
callOnCheck: false,
67+
callOnInit: false,
68+
callOnAllChangesDone: false
69+
);
6470
}
6571

6672
@override
@@ -126,6 +132,10 @@ class _DirectiveMetadataVisitor extends Object
126132
break;
127133
case 'hostListeners':
128134
_populateHostListeners(node.expression);
135+
break;
136+
case 'lifecycle':
137+
_populateLifecycle(node.expression);
138+
break;
129139
}
130140
return null;
131141
}
@@ -214,4 +224,20 @@ class _DirectiveMetadataVisitor extends Object
214224
_populateMap(
215225
hostAttributeValue, meta.hostAttributes, 'Directive#hostAttributes');
216226
}
227+
228+
void _populateLifecycle(Expression lifecycleValue) {
229+
_checkMeta();
230+
if (lifecycleValue is! ListLiteral) {
231+
throw new FormatException(
232+
'Angular 2 expects a List but could not understand the value for lifecycle. '
233+
'$lifecycleValue');
234+
}
235+
ListLiteral l = lifecycleValue;
236+
var lifecycleEvents = l.elements.map((s) => s.toSource());
237+
meta.callOnDestroy = lifecycleEvents.contains("onDestroy");
238+
meta.callOnChange = lifecycleEvents.contains("onChange");
239+
meta.callOnCheck = lifecycleEvents.contains("onCheck");
240+
meta.callOnInit = lifecycleEvents.contains("onInit");
241+
meta.callOnAllChangesDone = lifecycleEvents.contains("onAllChangesDone");
242+
}
217243
}

modules/angular2/test/render/dom/convert_spec.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ export function main() {
1515
properties: ['propKey: propVal'],
1616
readAttributes: ['read1', 'read2'],
1717
selector: 'some-comp',
18-
type: DirectiveMetadata.COMPONENT_TYPE
18+
type: DirectiveMetadata.COMPONENT_TYPE,
19+
callOnDestroy: true,
20+
callOnChange: true,
21+
callOnCheck: true,
22+
callOnInit: true,
23+
callOnAllChangesDone: true
1924
});
2025
var map = directiveMetadataToMap(someComponent);
2126
expect(MapWrapper.get(map, 'compileChildren')).toEqual(false);
@@ -30,6 +35,11 @@ export function main() {
3035
expect(MapWrapper.get(map, 'readAttributes')).toEqual(['read1', 'read2']);
3136
expect(MapWrapper.get(map, 'selector')).toEqual('some-comp');
3237
expect(MapWrapper.get(map, 'type')).toEqual(DirectiveMetadata.COMPONENT_TYPE);
38+
expect(MapWrapper.get(map, 'callOnDestroy')).toEqual(true);
39+
expect(MapWrapper.get(map, 'callOnCheck')).toEqual(true);
40+
expect(MapWrapper.get(map, 'callOnChange')).toEqual(true);
41+
expect(MapWrapper.get(map, 'callOnInit')).toEqual(true);
42+
expect(MapWrapper.get(map, 'callOnAllChangesDone')).toEqual(true);
3343
});
3444

3545
it('mapToDirectiveMetadata', () => {
@@ -42,7 +52,12 @@ export function main() {
4252
['properties', ['propKey: propVal']],
4353
['readAttributes', ['readTest1', 'readTest2']],
4454
['selector', 'testSelector'],
45-
['type', DirectiveMetadata.DIRECTIVE_TYPE]
55+
['type', DirectiveMetadata.DIRECTIVE_TYPE],
56+
['callOnDestroy', true],
57+
['callOnCheck', true],
58+
['callOnInit', true],
59+
['callOnChange', true],
60+
['callOnAllChangesDone', true]
4661
]);
4762
var meta = directiveMetadataFromMap(map);
4863
expect(meta.compileChildren).toEqual(false);
@@ -56,6 +71,11 @@ export function main() {
5671
expect(meta.readAttributes).toEqual(['readTest1', 'readTest2']);
5772
expect(meta.selector).toEqual('testSelector');
5873
expect(meta.type).toEqual(DirectiveMetadata.DIRECTIVE_TYPE);
74+
expect(meta.callOnDestroy).toEqual(true);
75+
expect(meta.callOnCheck).toEqual(true);
76+
expect(meta.callOnInit).toEqual(true);
77+
expect(meta.callOnChange).toEqual(true);
78+
expect(meta.callOnAllChangesDone).toEqual(true);
5979
});
6080
});
6181
}

modules/angular2/test/transform/directive_metadata_extractor/all_tests.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,16 @@ void allTests() {
7878
expect(metadata.hostListeners['keyDown']).toEqual('onKeyDown(\$event)');
7979
});
8080

81+
it('should parse lifecycle events.', () async {
82+
var metadata = await readMetadata('directive_metadata_extractor/'
83+
'directive_metadata_files/lifecycle.ng_deps.dart');
84+
expect(metadata.callOnDestroy).toBe(true);
85+
expect(metadata.callOnChange).toBe(true);
86+
expect(metadata.callOnCheck).toBe(true);
87+
expect(metadata.callOnInit).toBe(true);
88+
expect(metadata.callOnAllChangesDone).toBe(true);
89+
});
90+
8191
it('should fail when a class is annotated with multiple Directives.',
8292
() async {
8393
var ngDeps = await parser.parse(new AssetId('a',
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
library examples.hello_world.index_common_dart.ng_deps.dart;
2+
3+
import 'hello.dart';
4+
import 'package:angular2/angular2.dart'
5+
show bootstrap, Component, Directive, View, NgElement, onChange, onDestroy, onInit, onCheck, onAllChangesDone;
6+
7+
var _visited = false;
8+
void initReflector(reflector) {
9+
if (_visited) return;
10+
_visited = true;
11+
reflector
12+
..registerType(HelloCmp, {
13+
'factory': () => new HelloCmp(),
14+
'parameters': const [const []],
15+
'annotations': const [
16+
const Component(lifecycle: [onChange, onDestroy, onInit, onCheck, onAllChangesDone])
17+
]
18+
});
19+
}

modules/angular2/test/transform/integration/simple_annotation_files/expected/bar.ng_meta.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,11 @@
1010
"properties": [],
1111
"readAttributes": [],
1212
"type": 1,
13+
"callOnDestroy": false,
14+
"callOnCheck": false,
15+
"callOnInit": false,
16+
"callOnChange": false,
17+
"callOnAllChangesDone": false,
1318
"version": 1
1419
}
1520
}

0 commit comments

Comments
 (0)