angular - 在 Angular 2 中使用 ComponentResolver 加载组件时注入(inject)不同的提供程序

标签 angular angular2-injection

我们可以在动态加载组件时注入(inject)不同的提供程序吗?

我的组件

  @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的提供者也会被解析,我们可以根据一些开关来不同地解析它吗?

最佳答案

ViewContainerRef.createComponent

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

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

您可以创建一个新的注入(inject)器 Injector

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

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

constructor(private injector:Injector) {}

Injector 是通用基类 ReflectiveInjector 是具体实现。

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

这样,当前组件可用的提供程序就会被传递,并添加CarChild。因此,child 无法解析的提供程序(CarEngine 除外)会尝试从父注入(inject)器解析。

Plunker example

关于angular - 在 Angular 2 中使用 ComponentResolver 加载组件时注入(inject)不同的提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37734426/

相关文章:

css - 如何使Angular的<router-outlet>与CSS Grid一起使用

javascript - Angular2 导入语法 : "import * as <foo>" vs "import {<foo>}"

Angular 2通过字符串名称获取服务

angular - 在没有构造函数注入(inject)的情况下获取服务实例

由于不允许的 MIME 类型 (“text/html”,ASP Net Core 中的 Angular 8 被阻止)

javascript - 构建页面时 promise 中断

javascript - 在外部 javascript 函数中调用 typescript 函数

angular - 带有 Angular 9 的 Ionic 5 - Angular JIT 编译失败 : '@angular/compiler' not loaded

angular - 当 token 可以是多个值时,通过 Injector.get() 获取父组件

Angular2 - 如何将服务注入(inject)自定义异常处理程序