fix(di): hostInjector and viewInjector support nested arrays

This commit is contained in:
vsavkin 2015-07-09 11:40:09 -07:00
parent b716046b97
commit 0ed5dd0d7b
6 changed files with 24 additions and 12 deletions

View File

@ -24,7 +24,6 @@ export * from './src/di/decorators';
export {forwardRef, resolveForwardRef, ForwardRefFn} from './src/di/forward_ref';
export {
resolveBindings,
Injector,
ProtoInjector,
DependencyProvider,

View File

@ -25,7 +25,6 @@ import {
AbstractBindingError,
CyclicDependencyError,
resolveForwardRef,
resolveBindings,
VisibilityMetadata,
DependencyProvider,
self
@ -240,9 +239,9 @@ export class DirectiveBinding extends ResolvedBinding {
var rb = binding.resolve();
var deps = ListWrapper.map(rb.dependencies, DirectiveDependency.createFrom);
var resolvedHostInjectables =
isPresent(ann.hostInjector) ? resolveBindings(ann.hostInjector) : [];
isPresent(ann.hostInjector) ? Injector.resolve(ann.hostInjector) : [];
var resolvedViewInjectables = ann instanceof Component && isPresent(ann.viewInjector) ?
resolveBindings(ann.viewInjector) :
Injector.resolve(ann.viewInjector) :
[];
var metadata = DirectiveMetadata.create({
id: stringify(rb.key.token),

View File

@ -364,7 +364,6 @@ function _createProtoElementInjector(binderIndex, parentPeiWithDistance, renderE
if (directiveBindings.length > 0 || hasVariables) {
var directiveVariableBindings =
createDirectiveVariableBindings(renderElementBinder, directiveBindings);
protoElementInjector =
ProtoElementInjector.create(parentPeiWithDistance.protoElementInjector, binderIndex,
directiveBindings, isPresent(componentDirectiveBinding),

View File

@ -467,7 +467,7 @@ export class Injector {
* `fromResolvedBindings` and `createChildFromResolved`.
*/
static resolve(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
var resolvedBindings = resolveBindings(bindings);
var resolvedBindings = _resolveBindings(bindings);
var flatten = _flattenBindings(resolvedBindings, new Map());
return _createListOfBindings(flatten);
}
@ -765,7 +765,7 @@ export class Injector {
}
export function resolveBindings(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
function _resolveBindings(bindings: List<Type | Binding | List<any>>): List<ResolvedBinding> {
var resolvedList = ListWrapper.createFixedSize(bindings.length);
for (var i = 0; i < bindings.length; i++) {
var unresolved = resolveForwardRef(bindings[i]);
@ -777,7 +777,7 @@ export function resolveBindings(bindings: List<Type | Binding | List<any>>): Lis
} else if (unresolved instanceof Binding) {
resolved = unresolved.resolve();
} else if (unresolved instanceof List) {
resolved = resolveBindings(unresolved);
resolved = _resolveBindings(unresolved);
} else if (unresolved instanceof BindingBuilder) {
throw new InvalidBindingError(unresolved.token);
} else {

View File

@ -40,7 +40,7 @@ import {
Directive,
onDestroy
} from 'angular2/annotations';
import {bind, Injector, Binding, resolveBindings, Optional, Inject, Injectable, Self, Parent, Ancestor, Unbounded, self, InjectMetadata, ParentMetadata} from 'angular2/di';
import {bind, Injector, Binding, Optional, Inject, Injectable, Self, Parent, Ancestor, Unbounded, self, InjectMetadata, ParentMetadata} from 'angular2/di';
import {AppProtoView, AppView} from 'angular2/src/core/compiler/view';
import {ViewContainerRef} from 'angular2/src/core/compiler/view_container_ref';
import {ProtoViewRef} from 'angular2/src/core/compiler/view_ref';
@ -486,6 +486,21 @@ export function main() {
expect(pei.getBindingAtIndex(1).key.token).toEqual("injectable1");
});
it("should collect view and host injectables from nested arrays", () => {
var pei = createPei(null, 0, [
DirectiveBinding.createFromType(
SimpleDirective,
new dirAnn.Component({
viewInjector: [[[bind('view').toValue('view')]]],
hostInjector: [[[bind('host').toValue('host')]]]
}))
], 0, true);
expect(pei.getBindingAtIndex(0).key.token).toBe(SimpleDirective);
expect(pei.getBindingAtIndex(1).key.token).toEqual("view");
expect(pei.getBindingAtIndex(2).key.token).toEqual("host");
});
it('should support an arbitrary number of bindings', () => {
var pei = createPei(null, 0, dynamicBindings);

View File

@ -1007,7 +1007,7 @@ export function main() {
inject([TestComponentBuilder, AsyncTestCompleter], (tcb: TestComponentBuilder, async) => {
tcb.overrideView(MyComp, new viewAnn.View({
template: `
<directive-providing-injectable>
<directive-providing-injectable >
<directive-consuming-injectable #consuming>
</directive-consuming-injectable>
</directive-providing-injectable>
@ -1697,12 +1697,12 @@ class DirectiveWithTwoWayBinding {
class InjectableService {
}
@Directive({selector: 'directive-providing-injectable', hostInjector: [InjectableService]})
@Directive({selector: 'directive-providing-injectable', hostInjector: [[InjectableService]]})
@Injectable()
class DirectiveProvidingInjectable {
}
@Component({selector: 'directive-providing-injectable', viewInjector: [InjectableService]})
@Component({selector: 'directive-providing-injectable', viewInjector: [[InjectableService]]})
@View({template: ''})
@Injectable()
class DirectiveProvidingInjectableInView {