问题标签 [angular2-di]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
651 浏览

angular - Angular2提供覆盖类

我创建了一个自定义 Http 提供程序来在我们的应用程序的一个地方处理 http 错误。在 RC4 中,我曾经像这样引导应用程序来实现这一点:

现在我正在运行发布版本,我该如何做类似的事情?我可以在我的主 app.module 中以某种方式使用提供吗?

谢谢!

0 投票
0 回答
2311 浏览

angular - Angular2 DI:如何在@NgModule 下注入依赖项?

TL;DR 25.10.16:更新

我重命名了标题以提供更多说明,因为我仍然担心正确的解决方案。

给定一个模块

所以我的问题是:我可以像这样通过传递的配置注入依赖项吗?

  1. ExternalModule.forRoot(@Inject(MyConfig) config : MyConfig)
  2. providers: [EXTERNAL_PROVIDERS(@Inject(MyConfig) config)] (

我不想{provide: xxx, deps :[xxx], useFactory : xxx}为每个给定的外部提供者创建。

我尝试按照此处Application Wide Service Locator所述通过访问根注入器来初始化 a ,但是使用 Angular 2.1.0无法按预期工作。ngDoBootstrap

----------

旧帖:

我想知道在 Angular2 中配置外部第三方库提供程序的正确模式是什么。

举个例子(Typescript 中的代码示例):

有一个库公开了它的提供者,并通过config对象字面量提供了一些配置选项:

然后在客户端,这些提供程序可以包含在@NgModule

但是,如果我的配置对象本身依赖于现有的服务,例如MyService?我无法在提供程序数组中注入依赖项。从我的角度来看,唯一的方法是使用FactoryProvider

鉴于此,我该如何MyConfig注入THIRD_PARTY_PROVIDERS


我想出的唯一解决方案并不令人满意:

  1. OpaqueToken像这里一样使用从第三方提供方导出的(Angular 2 路由器)
  2. 从客户端手动配置所有提供程序

第一个只能从第三方提供者完成:导出令牌并要求该令牌作为工厂提供者中自己的依赖项。

第二个就很丑了,因为第三方lib的实现细节/服务需要自己去了解和配置。

angular 2(客户端和第三方提供商端)的首选模式是什么?


19.10.16 更新

我实施了我的第一个解决方案提案,并且效果很好。但它要求您控制外部库/同意项目所有者对您的更改或分叉 repo

第三方-lib.ts:

我的模块.ts

但是,如果外部库需要您将配置作为参数传递(如顶部的示例),我仍然不知道如何将 myconfig 注入其中。

@Inject()除了构造函数或工厂提供者之外,Angular 是否还有其他方法可以注入依赖项?

0 投票
1 回答
174 浏览

angular - 通过多个指令提供服务时的优先规则是什么?

我希望能够通过添加指令来修改组件行为。

我的方法是定义服务类中的行为,这些行为由组件提供并提供给组件。这些指令有自己的服务提供者,因此会覆盖组件的提供者。

这确实有效,但是当有多个指令提供具有相同令牌的服务时,我找不到关于会发生什么的规则:

根据我的观察,指令中的提供者似乎总是优先于组件中的提供者。在指令之间,它始终是声明数组(而不是 HTML)中“获胜”的最后一个。

Plunkr:https ://plnkr.co/edit/jdN9GaRTzoe7UQj2PIeP?p=preview

我的问题是,是否支持这种覆盖提供者,如果我至少可以依赖我的假设,指令提供的服务总是优先于组件提供的服务?

0 投票
1 回答
298 浏览

angular - 子组件中的 DI 错误

我正在开发一个(非常)巨大的 Angular 2 应用程序作为我公司的内部工具。该应用程序由不同的子应用程序组成,只能由某些用户访问。

为了做到这一点,我尝试使用 CanActivate 类返回一个可观察对象,查询我的一项服务以验证访问权限,但是当我尝试导入服务时,该类的构造函数无效。

所以我在应用程序本身中移动了测试,但它以同样的方式失败了。所以很可能问题出在服务本身。非常奇怪的是,apps 容器使用的是相同的服务,完全没有任何问题(该服务还提供可用应用程序的列表,生成应用程序菜单)。

我很确定问题是组件的加载顺序(并且可能与 -Http相关),但我不知道在哪里看。遗憾的是,鉴于应用程序的复杂性,我很难隔离问题,我不知道该怎么办。

我搜索了类似的问题,也发现了类似的情况,但是 Angular2 的开发同时向前推进了,那些解决方案已经变得毫无用处。

0 投票
1 回答
1728 浏览

angular - Angular 2 依赖注入:无法解析所有参数(没有 dep 链,没有桶)

我一直在尝试遵循 ng-book 2 中的一个示例,但在 DI 章节中遇到了困难。

这是一个 plunker https://plnkr.co/edit/KSXE9tnRj4tffiISyp0i它在手动创建 ReflectiveInjector 时完全有效,但是当我尝试采用简单的方法并在 NgModule 上的提供程序中声明它时,它失败给我“无法解决所有问题AppComponent 的依赖项”。我检查了其他答案,如您所见,没有循环依赖或与桶相关的问题 - 都在一个文件中。任何提示将不胜感激!

0 投票
2 回答
4334 浏览

angular - Angular 2 通过字符串名称获取服务

有没有办法仅通过服务名称获取 angular 2 的可注入服务的实例?

例如,在 Angular 1 中,您可以编写:

并且该service变量将获得该服务的一个实例。

我真的很感谢你们的帮助!

0 投票
1 回答
60 浏览

javascript - DI 的正确代币类型是什么

在 angular1 中,我们只有提供者的令牌类型 - 字符串。在 angular2 中,我看到的所有示例似乎都在使用类标记。例如:

我想知道有效的令牌类型是什么?它们可以基于 TypeScript 数据类型还是 JavaScript 数据类型?解决依赖关系时,角度使用 metadata。那么有效的令牌类型是那些在元数据中有效的吗?

0 投票
1 回答
131 浏览

angular - @Inject 真的只需要在不使用 TS 或 emitDecoratorMetadata:false 进行编译的情况下吗

我正在阅读这篇文章,它@Injectable@Inject以下内容:

问题解决了。事实上,这正是@Inject 在不使用 TypeScript 进行编译时的用途。如果我们现在看一下转译的代码,我们会看到所有需要的元数据都已生成(是的,简化了)。

...

我们基本上可以将任何装饰器放在我们的代码中,只要它附加到类声明或构造函数参数即可。换句话说,我们可以再次删除 @Inject 并使用我们放在类上的其他东西,因为这将导致 TypeScript 也为构造函数参数发出元数据......幸运的是,Angular 附带了另一个我们可以使用的装饰器。@Injectable 通常用于 Dart 元数据生成。它在 TypeScript 领域没有任何特殊含义,但事实证明它非常适合我们的用例。

那么,我的理解是否正确,即:

  1. 如果一个类被用作其他类的可注入但不依赖于任何其他类,则在构造函数中既不需要@Injectable 也不需要@Inject
  2. 如果一个类依赖于任何其他类并且没有使用任何装饰器,则它需要@Injectable()装饰器
  3. 如果 TS 和 一起使用emitDecoratorMetadata:true@Inject装饰器是没有用的
  4. 如果不使用 TS 或与 TS 一起使用emitDecoratorMetadata:false@Inject是指定依赖关系的唯一机制
0 投票
2 回答
596 浏览

angular - 在模块上定义的服务是否可以注入在同一模块声明的组件上定义的服务

在模块“my”上定义的服务可以注入在模块“my”声明的组件上定义的服务吗?

我已经测试过,似乎是这样,所以这个问题主要是为了确认。所以,我有这个组件定义ComboFeatureService

然后我有一项服务取决于ComboFeatureService

并且组件和服务都定义在同一个模块上:

我的理解是否正确,即使它们都定义在同一个模块上,ComboService也无法访问ComboFeatureService

如果是这种情况,那么据我所知,组件注入器不是根注入器的子代,对吗?

0 投票
1 回答
6759 浏览

angular - 为什么在 DI 中使用 `deps` 属性

这是来自angular.io的代码片段:

我的问题是为什么deps在这里使用属性?使用的一般情况是deps什么?