X Tutup
Skip to content

Commit 2e9de0b

Browse files
committed
feat(core): add sugar to use ContentChildren and ViewChildren as prop decorators
Closes #4237
1 parent 5dbe292 commit 2e9de0b

File tree

2 files changed

+52
-7
lines changed

2 files changed

+52
-7
lines changed

modules/angular2/src/core/compiler/directive_resolver.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ import {
88
PropertyMetadata,
99
EventMetadata,
1010
HostBindingMetadata,
11-
HostListenerMetadata
11+
HostListenerMetadata,
12+
ContentChildrenMetadata,
13+
ViewChildrenMetadata
1214
} from 'angular2/src/core/metadata';
1315
import {reflector} from 'angular2/src/core/reflection/reflection';
1416

@@ -44,6 +46,7 @@ export class DirectiveResolver {
4446
var properties = [];
4547
var events = [];
4648
var host = {};
49+
var queries = {};
4750

4851
StringMapWrapper.forEach(propertyMetadata, (metadata: any[], propName: string) => {
4952
metadata.forEach(a => {
@@ -75,17 +78,28 @@ export class DirectiveResolver {
7578
var args = isPresent(a.args) ? a.args.join(', ') : '';
7679
host[`(${a.eventName})`] = `${propName}(${args})`;
7780
}
81+
82+
if (a instanceof ContentChildrenMetadata) {
83+
queries[propName] = a;
84+
}
85+
86+
if (a instanceof ViewChildrenMetadata) {
87+
queries[propName] = a;
88+
}
7889
});
7990
});
80-
return this._merge(dm, properties, events, host);
91+
return this._merge(dm, properties, events, host, queries);
8192
}
8293

8394
private _merge(dm: DirectiveMetadata, properties: string[], events: string[],
84-
host: StringMap<string, string>): DirectiveMetadata {
95+
host: StringMap<string, string>,
96+
queries: StringMap<string, any>): DirectiveMetadata {
8597
var mergedProperties =
8698
isPresent(dm.properties) ? ListWrapper.concat(dm.properties, properties) : properties;
8799
var mergedEvents = isPresent(dm.events) ? ListWrapper.concat(dm.events, events) : events;
88100
var mergedHost = isPresent(dm.host) ? StringMapWrapper.merge(dm.host, host) : host;
101+
var mergedQueries =
102+
isPresent(dm.queries) ? StringMapWrapper.merge(dm.queries, queries) : queries;
89103

90104
if (dm instanceof ComponentMetadata) {
91105
return new ComponentMetadata({
@@ -98,6 +112,7 @@ export class DirectiveResolver {
98112
exportAs: dm.exportAs,
99113
moduleId: dm.moduleId,
100114
compileChildren: dm.compileChildren,
115+
queries: mergedQueries,
101116
changeDetection: dm.changeDetection,
102117
viewBindings: dm.viewBindings
103118
});
@@ -111,7 +126,8 @@ export class DirectiveResolver {
111126
bindings: dm.bindings,
112127
exportAs: dm.exportAs,
113128
moduleId: dm.moduleId,
114-
compileChildren: dm.compileChildren
129+
compileChildren: dm.compileChildren,
130+
queries: mergedQueries
115131
});
116132
}
117133
}

modules/angular2/test/core/compiler/directive_resolver_spec.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@ import {
66
Property,
77
Event,
88
HostBinding,
9-
HostListener
9+
HostListener,
10+
ContentChildren,
11+
ContentChildrenMetadata,
12+
ViewChildren,
13+
ViewChildrenMetadata
1014
} from 'angular2/src/core/metadata';
1115

1216
@Directive({selector: 'someDirective'})
@@ -64,6 +68,17 @@ class SomeDirectiveWithHostListeners {
6468
}
6569
}
6670

71+
@Directive({selector: 'someDirective', queries: {"cs": new ContentChildren("c")}})
72+
class SomeDirectiveWithContentChildren {
73+
@ContentChildren("a") as: any;
74+
c;
75+
}
76+
77+
@Directive({selector: 'someDirective', queries: {"cs": new ViewChildren("c")}})
78+
class SomeDirectiveWithViewChildren {
79+
@ViewChildren("a") as: any;
80+
c;
81+
}
6782

6883
class SomeDirectiveWithoutMetadata {}
6984

@@ -77,7 +92,7 @@ export function main() {
7792
var directiveMetadata = resolver.resolve(SomeDirective);
7893
expect(directiveMetadata)
7994
.toEqual(new DirectiveMetadata(
80-
{selector: 'someDirective', properties: [], events: [], host: {}}));
95+
{selector: 'someDirective', properties: [], events: [], host: {}, queries: {}}));
8196
});
8297

8398
it('should throw if not matching metadata is found', () => {
@@ -89,7 +104,7 @@ export function main() {
89104
var directiveMetadata = resolver.resolve(SomeChildDirective);
90105
expect(directiveMetadata)
91106
.toEqual(new DirectiveMetadata(
92-
{selector: 'someChildDirective', properties: [], events: [], host: {}}));
107+
{selector: 'someChildDirective', properties: [], events: [], host: {}, queries: {}}));
93108
});
94109

95110
describe('properties', () => {
@@ -128,5 +143,19 @@ export function main() {
128143
.toEqual({'(c)': 'onC()', '(a)': 'onA()', '(b)': 'onB($event.value)'});
129144
});
130145
});
146+
147+
describe('queries', () => {
148+
it('should append ContentChildren', () => {
149+
var directiveMetadata = resolver.resolve(SomeDirectiveWithContentChildren);
150+
expect(directiveMetadata.queries)
151+
.toEqual({"cs": new ContentChildren("c"), "as": new ContentChildren("a")});
152+
});
153+
154+
it('should append ViewChildren', () => {
155+
var directiveMetadata = resolver.resolve(SomeDirectiveWithViewChildren);
156+
expect(directiveMetadata.queries)
157+
.toEqual({"cs": new ViewChildren("c"), "as": new ViewChildren("a")});
158+
});
159+
});
131160
});
132161
}

0 commit comments

Comments
 (0)
X Tutup