问题标签 [angular-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 回答
1512 浏览

angular - Angular DI - useFactory - Provider:有没有办法在本地状态更新时第二次调用 Provider Factory 函数?

场景如下:

1. App 有根模块,它的构造函数解析一个 Promise 并返回一个常量。

2. 由于这个值是一个对象,而且它在运行时可用,我使用“useFactory”创建了一个注入令牌并在模块级别注册。

3. 我创建了一个全局常量,初始化为 null 并作为参数传递给工厂函数,使用哪个 angular 构造 Injector Token 并在引导时分配值 null(初始状态)。

4. 当 promise 从第 1 步解决时,我从 Promise 捕获返回的常量值并分配给这个声明的全局常量,作为它的常量,显然它正在更新并通过应用程序可用。

此外,角度文档指出 useFactory 提供程序会懒惰地创建它的值,我理解它会在注入时创建。如果是这样,当代码注入我的注入令牌时,全局常量就会更新。注入器令牌仍然为空。

Q1。有没有办法使用更新的本地状态调用提供程序工厂函数,以便我的注入器令牌将收到价值?

Q2。由于我使用全局常量,它使代码工作,但它不是松散耦合的,这也使得单元测试变得困难。是否有任何替代方法可以使用接收到的常量并在代码中使用它,以便松散耦合?

0 投票
1 回答
593 浏览

angular - 是否对任何非延迟加载的模块使用@Injectable providedIn 与providedIn:“root”相同?

我已经彻底阅读了文档,虽然我无法准确找到它的引用位置,但我的印象是,在急切加载的模块providers数组中声明服务将使单例可用于应用程序范围。如果这是真的,

用于@Injectable providedIn任何非延迟加载的模块是否与 相同providedIn: "root"

0 投票
1 回答
698 浏览

angular - 为什么 Angular CLI 不会自动在提供者数组中添加服务?

当我们使用命令创建Component时,CLI 会自动将它们添加到特定模块的声明数组中,为什么在服务的情况下不会发生这种情况。Pipeangular-cli

0 投票
1 回答
2314 浏览

angular - 带字符串标记的角度动态 DI

似乎 Angular 6 (4+?) 要求令牌对象是唯一的才能使 DI 工作。然而,我想使用从模板 html 代码提供的动态令牌,这将允许我的新指令通过 name解析服务。

目前代码:

失败:

当我用旧的(角度 4)Injector.get 函数替换我的代码时,它工作正常,因为注入器比较名称(并且我确实通过该名称在视图中提供服务......)。然而,有了新的 DI,我无法实现我想要的。

那么,该如何应对呢?

0 投票
1 回答
468 浏览

angular - 如何仅在一个特定的 NgModule 中添加 http 拦截器(没有延迟加载)?

我需要实现一些功能。我想在模块 A 和 B 中提供一些 http 拦截器。我希望从模块 A 发送的每个 http 请求都带有一些标头,例如“zone: a-feature”。来自模块 B 的任何请求都必须使用诸如“zone: b-feature”之类的标头发送。

我正在尝试使用自定义 http 拦截器来实现这一点。

这是我尝试过的:https ://stackblitz.com/edit/angular-j3siwz

  1. 我用 2 个组件 A 和 B 创建了 2 个模块
  2. 每个组件发送请求
  3. 每个模块都有自定义的 TOKEN 提供者
  4. 在 http 拦截器中,我想注入令牌提供程序。

问题是角度是如何工作的 :) 看起来,按照设计,所有依赖项都在某些“根模块”中提供。因此,当我在 B 模块中提供“另一个”令牌时,我只需在根模块注入器中重写此令牌。

因此,在我的两个请求的示例中,我在控制台日志中都收到了“a-feature”消息。拦截器仅使用 1 个令牌值创建一次(下面的文章准确描述了行为为何如此)。

看起来角度文档清楚地说明了这一点:https ://angular.io/guide/dependency-injection

我还发现并红色了这篇完美的文章:https ://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d 。

看起来,延迟加载模块的工作方式不同。但在我的情况下,我没有延迟加载,所以我不能在我的情况下使用这个完美的功能。

所以,我的问题是如何在那个复杂的世界中实现我需要的功能?

我不知道该怎么做。我也尝试过:提供不同的拦截器,装饰 HttpClient,使用工厂和其他东西。他们中的任何一个都给了我相同的结果。

升级版:

我也了解multi提供者对象中的属性。通过这个我可以获得所有模块中提供的所有令牌,但我没有看到完整的解决方案。我如何能够检测到该数组中的确切令牌应该应用于特定的 http 请求(它可以来自任何模块)?

0 投票
0 回答
57 浏览

angular - 如何以角度将服务实例注入功能模块

我想将一个服务创建的一个模块注入到第二个完全不同的模块中,这取决于第一个模块创建的一些数据。假设您将一个用于身份验证的功能模块导入到您的项目中,还导入了一个用于创建 websocket 的模块。出于身份验证的目的,您需要一个保存在本地存储中的 id,服务可以很容易地从已经创建的身份验证模块访问该 ID。在 websocket 模块中,我在forRoot方法中提供了一个配置,因此可以定义套接字端点,以及已经从身份验证模块创建的身份验证服务实例。

现在我的问题是:如何获取此服务实例以及如何将其注入到 websocket 模块的配置中?

0 投票
0 回答
37 浏览

angular - 在 Angular 中动态提供服务

我有一个 DI 问题,我试图在不使代码臃肿的情况下解决:

设置如下:

我有一个基本表单类“A”,它与使用服务“B”的一些子组件进行通信。

类“A”有许多(比如 50 个)继承表单组件,如果我想为每个组件提供服务,我将不得不通过每个组件声明并提供服务“B”。

那么,为什么不只提供你问的 root 呢?好吧,这项服务需要在表单存在的同时存在,尽管有可能,但它需要我跟踪表单的生命周期并在停用警卫时清除服务......这不是解决问题的一种非常强大的方法问题(可以这么说......)。

我想到的另一个想法是提供服务......动态......但我认为这不受支持/在Angular中做事的方式?可能这只是不支持。

我可以提供一个服务定位器模式,但这只会与现有的 DI 竞争。

0 投票
1 回答
93 浏览

angular - 在自定义 Angular 验证器中注入 Angular 服务

我在 Angular 中创建了一个自定义验证器。我在验证器validateFund函数中使用了 Angular 服务。但是,Angular 提供了一个新的服务实例;当我尝试验证数据时,我的验证总是失败,因为服务实例是新的并且没有服务的其他实例中存在的数据。

这是验证器:

0 投票
1 回答
31 浏览

angular - Angular:如果我们将 .js 或 .ts 放在 import 语句的末尾,则依赖注入不会正确发生

典型的导入语句如下所示:

如果我在构造函数中自动装配HelpService,我会得到一个现有的HelpService. 但是,如果我这样导入它:

现在,我收到了一个全新的服务实例,而不是现有的实例。为什么会这样?

0 投票
1 回答
239 浏览

angular - 如何将动态变量从服务传递给 http_interceptor

我有多个角度项目,每个项目都有一个调用相同 API 的服务。我一直在向请求添加一个标头,以确定从哪个应用程序发送了请求。所以我一直在尝试创建一个具有基本服务类的库来设置标头值

和一个http 拦截器,用于将该动态值作为标头附加到请求中

最后是一个将动态值设置为提供者的工厂

但我不知道如何在模块中设置提供程序并低于错误,这不是很有帮助。

有人可以指出我正确的方向吗?

谢谢你。