【问题标题】:Import providers from a sibling module in Angular 2从 Angular 2 中的同级模块导入提供程序
【发布时间】:2018-03-10 08:33:37
【问题描述】:

我的 Angular 2 项目中有以下模块结构:

  app
   |-module1
   |-module2
        |-component2-1
        |-component2-2
        |-factories

factory 模块有几个提供者,定义如下:

@NgModule({
    providers: [                               
        { provide: Class1,          
          useFactory: Class1Factory,
          deps: [SameModuleDependency],          
          multi: true                       
        },
        { provide: Class2,
          useFactory: Class2Factory
        }
    ]
})

export function Class1Factory(): Class1 { ... }

export function Class2Factory(): Class2 { ... }

假设我想让这些工厂提供程序可用于模块 2 中的组件 2-1 和 2-2。我应该如何在模块 2 的模块定义中导入它们?我还没有找到这些例子。

我猜如果我单独导出每个提供程序,执行以下操作:

Class1Provider: Provider = {provide: Class1, useFactory: ... }
Class2Provider: Provider = {provide: Class2, useFactory: ....}

然后在 module2 定义中我可以声明它们:

import { Class1Provider, Class2Provider } ....

@NgModule({

  providers: [Class1Provider, Class2Provider]

})

但是,我还没有找到一种方法来完成这项工作(导出实例,而不是类定义)

此外,我希望有几个提供程序,但并非所有同级组件都使用它们,所以我不希望单独导出/导入每个。

额外问题:如果我想让它在 module1 的组件中可用怎么办?

【问题讨论】:

  • 是否有模块参与惰性路由?
  • @AngularInDepth.com 目前,不是。我预计不会很快如此。
  • 工厂模块有几个模块定义如下 - 这里modules是什么意思?
  • @AngularInDepth.com 一个错误。我纠正了它。对不起
  • 这里是I have the following module structure module 你的意思是angular modules

标签: angular dependency-injection


【解决方案1】:

如果您只在这样的模块中定义提供程序:

@NgModule({
    providers: [                               
        { provide: Class1,          
          useFactory: Class1Factory,
          deps: [SameModuleDependency],          
          multi: true                       
        },
        { provide: Class2,
          useFactory: Class2Factory
        }
    ]
})
export class FactoriesModule {}

FactoriesModule 导入根模块就足够了:

@NgModule({
  imports: [
    BrowserModule,
    FactoryModule   <---------------------
  ],
  ...
})
export class AppModule { }

因此组件将能够使用相关令牌注入提供者:

class MyComponent {
    constructor(service: Class1) {}

这是因为来自所有模块的提供程序在编译期间被合并。

See this demo.

我强烈建议阅读:Avoiding common confusions with modules in Angular 解释细节的文章

【讨论】:

  • @angularindepth-com 我尝试了这个解决方案,但它不起作用。如果我在工厂模块中导出 Class1Factory 并将提供程序定义移动到模块 2。有用。因此,看起来提供者没有被合并。
  • 它们肯定是合并的,请阅读文章。创建一个stackblitz demo,我来看看
  • @angularindepth-com 我用这个玩具应用程序复制了这个问题。 stackblitz.com/edit/angular-yv5mpq 在我的本地设置中,我收到此错误:zone.js:690 未处理的承诺拒绝:没有 Class1 的提供者! ;区域: ;任务:Promise.then ;值:错误:没有 Class1 的提供者!
  • 显然我没有保存项目的最新版本。很抱歉。
  • @angularindepth-com 我用我在本地测试的项目的副本更新了项目。
猜你喜欢
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2016-07-29
  • 1970-01-01
  • 2015-08-21
  • 2017-07-30
相关资源
最近更新 更多