2

我们可以在动态加载组件的同时注入不同的提供者吗?

我的组件

  @Component({
     moduleId: module.id,
     selector: "my-component",
     template: "<div>my-component</div>",
     providers: [MyComponentService]
  })
  export class MyComponent{

     constructor(private ds: MyComponentService) {
        super();
     }    
   }

别的地方,

     this._cr.resolveComponent(MyComponent).then(cmpFactory => {
        let instance: any = this.testComponentContainer.createComponent(cmpFactory).instance;
    });

所以在上面的代码中,在解析的同时MyComponent,提供者MyComponentService也会被解析,我们可以根据一些开关来不同地解析它吗?

4

1 回答 1

3

ViewContainerRef.createComponent

createComponent(componentFactory: ComponentFactory<C>, index?: number, injector?: Injector, projectableNodes?: any[][]) : ComponentRef<C>

有一个injector参数。如果您通过一项,则此一项用于解析提供程序。我不认为您可以覆盖添加到@Component()装饰器的提供程序。

您可以创建一个新的注射器Injector

let injector = ReflectiveInjector.resolveAndCreate([Car, Engine])

并传递此注入器,或者您可以将注入器注入到调用ViewContainerRef.createComponent并创建子注入器的组件中。

constructor(private injector:Injector) {}

Injector是泛型基类ReflectiveInjector是具体实现。

let resolvedProviders = ReflectiveInjector.resolve([Car, Engine]);
let child = ReflectiveInjector.fromResolvedProviders(resolvedProviders, this.injector);

这样,当前组件可用的提供程序将被传递 和Car,并被Child添加。因此,child无法解析的提供者(除了Carand Engine)被尝试从父注入器解析。

Plunker 示例

于 2016-06-09T19:28:31.600 回答