Angular2如何覆盖提供者

时间:2017-01-16 22:17:33

标签: angular

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

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

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

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    cell.someObject.cancelLoading()
}

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

谢谢!

3 个答案:

答案 0 :(得分:10)

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

  

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

     

当Angular寻找为该令牌注入服务时,它会创建和   提供由第二个提供者创建的实例。

     

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

     

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

     

根AppModule提供的服务优先于   由进口模块提供的服务。 AppModule总是赢。

如果您在AppModule中提供提供商,则会将其用于导入模块中提供的提供商。

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

答案 1 :(得分:1)

您的路径似乎导入错误,您的服务文件需要位于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";

见下文work plunkr

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

答案 2 :(得分:0)

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

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

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

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