【问题标题】:Angular: Provide class in a component with all dependenciesAngular:在具有所有依赖项的组件中提供类
【发布时间】:2017-12-27 11:03:48
【问题描述】:

在 Angular (4+) 中,我想知道如何提供一个包含该类所有依赖项的可注入类。

示例:

DepMaster 是一个可注入对象,它又注入了依赖项,即:

DepServantA
DepServantB

如果我提供DepMaster,我还必须提供所有依赖项和子依赖项。以下不起作用:

@Component({
    // ...
    providers: [
       DepMaster
    ]
})

为了让它工作,我必须写

@Component({
    // ...
    providers: [
       DepMaster
       DepServant1,
       DepServant2,
    ]
})

在提供DepMaster 时,我不想打扰DepMaster 的哪些依赖项。我只想提供DepMaster 及其所有依赖项。

必须列出所有依赖项和子依赖项是不可能维护的。每当子依赖项发生变化时,我都必须更新用法。 这样,使用将取决于实现细节。

【问题讨论】:

    标签: angular typescript dependency-injection


    【解决方案1】:

    我的解决方案是在我的大师班中有一个依赖项列表。然后我可以把这个列表和大师班一​​起提供。

    @Injectable()
    export class MyMaster {
    
       // list of dependencies which have to be provided for this class
       static readonly PROVIDES: any = [
          AuGridBuilder,
          AuTableManager,
          AuTabBuilder,
          ApMenuBuilder
       ].concat(
          AuGridBuilder.PROVIDES,
          AuTableManager.PROVIDES,
          AuTabBuilder.PROVIDES,
          ApMenuBuilder.PROVIDES
       );
    
       constructor( private gridBuilder: AuGridBuilder,
                    private tableManager: AuTableManager,
                    private tabBuilder: AuTabBuilder,
                    private menuBuilder: ApMenuBuilder )
       {
          // ...
       }
    

    这是在每个可注入类中完成的。 然后在模块中,我可以轻松地提供 master 及其所有必须提供的依赖项:

    providers: [ MyMaster, MyMaster.PROVIDES ]
    

    【讨论】:

    • PS:如果应该在组件中提供注射剂,这也适用。
    【解决方案2】:

    对于这种要求,您可以为这些依赖项和您的 DepMaster 像这样制作单独的模块

    @NgModule({
        declarations: [  ],
        imports: [],
        providers: [
           DepMaster,
           DepServant1,
           DepServant2,]
    })
    export class DevMasterModule { }
    

    然后将这个模块导入到你想要提供这些服务的任何地方。例如

     @NgModule({
         declarations: [
                AppComponent
              ],
         imports: [
                BrowserModule, ReactiveFormsModule, DevMasterModule 
              ],
         providers: [],
         bootstrap: [AppComponent]
        })
     export class AppModule { }
    

    【讨论】:

    • 还要在组件内提供?我需要在组件中提供它。
    • 我无法让您详细说明
    • 在 @Component() 说明符中无法导入模块。
    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 2019-01-09
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 2016-05-28
    相关资源
    最近更新 更多