【问题标题】:Is there a way to chain @Injectable() in Angular4有没有办法在Angular4中链接@Injectable()
【发布时间】:2017-12-25 06:23:51
【问题描述】:

我正在构建一个 Ionic 3 应用程序(使用 Angular 4)。我创建了一个 LocationProvider,它允许我从实际的页面逻辑中提取位置服务,以便它可以重用。

My LocationProvider 使用@ionic-native/geolocation(地理位置提供者)。

当我通过 @NgModule({ providers: [LocationProvider] }) 将 LocationProvider 注入页面时,我收到一条错误消息,提示找不到地理位置提供程序。每当使用 LocationProvider 时,有什么方法可以包含 Geolocation 提供程序?还是我需要一直拥有providers:[LocationProvider, Geolocation]

我猜这不是 Ionic 特有的(而是 Angular 4),有什么办法可以在 NgModule 中列出这两个提供者?

【问题讨论】:

    标签: angular ionic3 angular2-di


    【解决方案1】:

    providers 接受单个提供者和提供者数组。

    可以

    export const LOCATION_PROVIDERS = [LocationProvider, Geolocation];
    ...
    providers: [LOCATION_PROVIDERS]
    ...
    

    提供者也可以用自己的模块包装并导入。

    【讨论】:

    • 当你说“Providers也可以被包装...”时,你的意思是导出@NgModule({ providers: [LocationProvider, Geolocation]})吗?然后通过@NgModule({ imports: [LocationProviderModule]}) 导入?我是否需要担心会导致 Geolocation 被导入 10 次之类的?
    • 没错。除非您正在处理延迟加载的模块,否则您无需担心。所有常规模块共享相同的注入器。参考stackoverflow.com/questions/39031284/…
    • 这是有道理的。那么我是否需要担心子注入器存储的值与主注入器不同? (对于 ng4 找不到太多关于此的内容,似乎只是在寻找原始 ng1 的东西)
    • 除非您在子注入器providers 中定义这些提供程序(延迟加载的模块、组件等),否则应该没有问题。
    • 最后一个问题。使用这些解决方案有什么本质上的坏处吗?最初使用LOCATION_PROVIDERS 或将其包装在一个模块中似乎更简单,但它们似乎也需要了解该项目(对于“下一个将处理代码的可怜的笨蛋”不利)。导入LocationProviderGeolocation 似乎对任何出现的人来说都是最简单的(特别是因为当你做错时它会给你一个很好的错误)并且你最不可能在不同的地方有不同的导入风格类(以及来自不同的开发者)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2019-07-12
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    相关资源
    最近更新 更多