X Tutup
Skip to content

Commit 0ed5dd0

Browse files
committed
fix(di): hostInjector and viewInjector support nested arrays
1 parent b716046 commit 0ed5dd0

File tree

6 files changed

+24
-12
lines changed

6 files changed

+24
-12
lines changed

modules/angular2/di.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ export * from './src/di/decorators';
2424

2525
export {forwardRef, resolveForwardRef, ForwardRefFn} from './src/di/forward_ref';
2626
export {
27-
resolveBindings,
2827
Injector,
2928
ProtoInjector,
3029
DependencyProvider,

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import {
2525
AbstractBindingError,
2626
CyclicDependencyError,
2727
resolveForwardRef,
28-
resolveBindings,
2928
VisibilityMetadata,
3029
DependencyProvider,
3130
self
@@ -240,9 +239,9 @@ export class DirectiveBinding extends ResolvedBinding {
240239
var rb = binding.resolve();
241240
var deps = ListWrapper.map(rb.dependencies, DirectiveDependency.createFrom);
242241
var resolvedHostInjectables =
243-
isPresent(ann.hostInjector) ? resolveBindings(ann.hostInjector) : [];
242+
isPresent(ann.hostInjector) ? Injector.resolve(ann.hostInjector) : [];
244243
var resolvedViewInjectables = ann instanceof Component && isPresent(ann.viewInjector) ?
245-
resolveBindings(ann.viewInjector) :
244+
Injector.resolve(ann.viewInjector) :
246245
[];
247246
var metadata = DirectiveMetadata.create({
248247
id: stringify(rb.key.token),

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -364,7 +364,6 @@ function _createProtoElementInjector(binderIndex, parentPeiWithDistance, renderE
364364
if (directiveBindings.length > 0 || hasVariables) {
365365
var directiveVariableBindings =
366366
createDirectiveVariableBindings(renderElementBinder, directiveBindings);
367-
368367
protoElementInjector =
369368
ProtoElementInjector.create(parentPeiWithDistance.protoElementInjector, binderIndex,
370369
directiveBindings, isPresent(componentDirectiveBinding),

modules/angular2/src/di/injector.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ export class Injector {
467467
* `fromResolvedBindings` and `createChildFromResolved`.
468468
*/
469469
static resolve(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
470-
var resolvedBindings = resolveBindings(bindings);
470+
var resolvedBindings = _resolveBindings(bindings);
471471
var flatten = _flattenBindings(resolvedBindings, new Map());
472472
return _createListOfBindings(flatten);
473473
}
@@ -765,7 +765,7 @@ export class Injector {
765765
}
766766

767767

768-
export function resolveBindings(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
768+
function _resolveBindings(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
769769
var resolvedList = ListWrapper.createFixedSize(bindings.length);
770770
for (var i = 0; i < bindings.length; i++) {
771771
var unresolved = resolveForwardRef(bindings[i]);
@@ -777,7 +777,7 @@ export function resolveBindings(bindings: List<Type | Binding | List<any>>): Lis
777777
} else if (unresolved instanceof Binding) {
778778
resolved = unresolved.resolve();
779779
} else if (unresolved instanceof List) {
780-
resolved = resolveBindings(unresolved);
780+
resolved = _resolveBindings(unresolved);
781781
} else if (unresolved instanceof BindingBuilder) {
782782
throw new InvalidBindingError(unresolved.token);
783783
} else {

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ import {
4040
Directive,
4141
onDestroy
4242
} from 'angular2/annotations';
43-
import {bind, Injector, Binding, resolveBindings, Optional, Inject, Injectable, Self, Parent, Ancestor, Unbounded, self, InjectMetadata, ParentMetadata} from 'angular2/di';
43+
import {bind, Injector, Binding, Optional, Inject, Injectable, Self, Parent, Ancestor, Unbounded, self, InjectMetadata, ParentMetadata} from 'angular2/di';
4444
import {AppProtoView, AppView} from 'angular2/src/core/compiler/view';
4545
import {ViewContainerRef} from 'angular2/src/core/compiler/view_container_ref';
4646
import {ProtoViewRef} from 'angular2/src/core/compiler/view_ref';
@@ -486,6 +486,21 @@ export function main() {
486486
expect(pei.getBindingAtIndex(1).key.token).toEqual("injectable1");
487487
});
488488

489+
it("should collect view and host injectables from nested arrays", () => {
490+
var pei = createPei(null, 0, [
491+
DirectiveBinding.createFromType(
492+
SimpleDirective,
493+
new dirAnn.Component({
494+
viewInjector: [[[bind('view').toValue('view')]]],
495+
hostInjector: [[[bind('host').toValue('host')]]]
496+
}))
497+
], 0, true);
498+
499+
expect(pei.getBindingAtIndex(0).key.token).toBe(SimpleDirective);
500+
expect(pei.getBindingAtIndex(1).key.token).toEqual("view");
501+
expect(pei.getBindingAtIndex(2).key.token).toEqual("host");
502+
});
503+
489504
it('should support an arbitrary number of bindings', () => {
490505
var pei = createPei(null, 0, dynamicBindings);
491506

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,7 +1007,7 @@ export function main() {
10071007
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
10081008
tcb.overrideView(MyComp, new viewAnn.View({
10091009
template: `
1010-
<directive-providing-injectable>
1010+
<directive-providing-injectable >
10111011
<directive-consuming-injectable #consuming>
10121012
</directive-consuming-injectable>
10131013
</directive-providing-injectable>
@@ -1697,12 +1697,12 @@ class DirectiveWithTwoWayBinding {
16971697
class InjectableService {
16981698
}
16991699

1700-
@Directive({selector: 'directive-providing-injectable', hostInjector: [InjectableService]})
1700+
@Directive({selector: 'directive-providing-injectable', hostInjector: [[InjectableService]]})
17011701
@Injectable()
17021702
class DirectiveProvidingInjectable {
17031703
}
17041704

1705-
@Component({selector: 'directive-providing-injectable', viewInjector: [InjectableService]})
1705+
@Component({selector: 'directive-providing-injectable', viewInjector: [[InjectableService]]})
17061706
@View({template: ''})
17071707
@Injectable()
17081708
class DirectiveProvidingInjectableInView {

0 commit comments

Comments
 (0)
X Tutup