【问题标题】:Angular2 How can I override providerAngular2我如何覆盖提供者
【发布时间】:2017-01-16 22:17:33
【问题描述】:

我是 Angular 新手,对提供程序覆盖有疑问。我想在我的项目https://www.npmjs.com/package/mydatepicker 中使用这个日期选择器。

我想覆盖这个库的组件使用的语言环境提供程序。这是示例https://plnkr.co/edit/fS8IoJqB8PYvgNEVGIMY

我从库类 (my.locale.service.ts) 扩展了 LocaleService 并想用它来代替它,所以我在我的模块中指定了它:

providers: [{provide: LocaleService, useClass: MyLocaleService }]

但它不起作用,组件仍然使用它自己的LocaleService。我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 这最终对你有用吗?我为此苦苦挣扎了一段时间,没有结果。

标签: angular


【解决方案1】:

https://angular.io/guide/ngmodule-faq#what-if-two-modules-provide-the-same-service

如果两个模块提供相同的服务怎么办?当两个进口 同时加载的模块列出具有相同令牌的提供程序, 第二个模块的提供者“获胜”。那是因为这两个提供商都是 添加到同一个注射器中。

当 Angular 为该令牌注入服务时,它会创建并 传递第二个提供者创建的实例。

注入此服务的每个类都会获得由 第二个提供者。甚至在第一个模块中声明的类也得到 由第二个提供者创建的实例。这可能是不受欢迎的 惊喜。

如果模块 A 为令牌“X”提供服务并导入模块 B 它还为令牌“X”提供服务,然后是模块 A 的服务 定义“赢”。

根 AppModule 提供的服务优先于 导入模块提供的服务。 AppModule 总是胜出。

如果您在AppModule 中提供提供程序,则此提供程序将用于导入模块中提供的提供程序。

这对于延迟加载的模块是不同的。如果在延迟加载的模块中提供了提供程序,则该模块延迟加载的组件和服务将获得延迟加载模块的提供程序的依赖,即使它也在 AppModule 中提供。

【讨论】:

  • “两个模块提供相同的服务”不是这里的挑战; “延迟加载的模块”也不是。挑战是模块 A 导入模块 B ;模块 B 定义组件 Bccomponent Bc provides service Bs ;模块A 如何更改提供给组件Bc 的服务的实现?显然更改 modules 上的提供程序,例如 A,不会 影响/覆盖 components 上的提供程序,例如 Bc,甚至是A 模块中的组件 Ac
【解决方案2】:

您的路径似乎导入错误,您的服务文件需要在 src 目录中。

import {MyDatePickerModule} from "mydatepicker/dist/my-date-picker.module";
import {LocaleService} from "mydatepicker/dist/services/my-date-picker.locale.service";
import {MyLocaleService} from "./my.locale.service";

请参阅下面的工作 plunkr

https://plnkr.co/edit/e63S9dGXSc65BcKWMPnd?p=preview

【讨论】:

  • 哦,谢谢!修好了我的笨蛋。所以现在的问题是如何用我自己的替换 LocaleService 库的组件使用。
【解决方案3】:

这对我有用(Angular 7.x):

 imports: [ MyCoreModule.forRoot()],
 providers: [{provide: LoginService, useValue: new LoginServiceMock()}]

登录服务是MyCoreModule 的一部分,但我可以使用模拟提供程序覆盖它。另外,如果您使用的是useValue,请不要忘记new yourService()

{ provide: MyService, useValue: new MockMyService1() }

【讨论】:

    猜你喜欢
    • 2013-07-22
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多