问题标签 [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.
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。由于我使用全局常量,它使代码工作,但它不是松散耦合的,这也使得单元测试变得困难。是否有任何替代方法可以使用接收到的常量并在代码中使用它,以便松散耦合?
angular - 是否对任何非延迟加载的模块使用@Injectable providedIn 与providedIn:“root”相同?
我已经彻底阅读了文档,虽然我无法准确找到它的引用位置,但我的印象是,在急切加载的模块providers
数组中声明服务将使单例可用于应用程序范围。如果这是真的,
用于
@Injectable
providedIn
任何非延迟加载的模块是否与 相同providedIn: "root"
?
angular - 为什么 Angular CLI 不会自动在提供者数组中添加服务?
当我们使用命令创建Component
时,CLI 会自动将它们添加到特定模块的声明数组中,为什么在服务的情况下不会发生这种情况。Pipe
angular-cli
angular - 带字符串标记的角度动态 DI
似乎 Angular 6 (4+?) 要求令牌对象是唯一的才能使 DI 工作。然而,我想使用从模板 html 代码提供的动态令牌,这将允许我的新指令通过 name解析服务。
目前代码:
失败:
当我用旧的(角度 4)Injector.get 函数替换我的代码时,它工作正常,因为注入器比较名称(并且我确实通过该名称在视图中提供服务......)。然而,有了新的 DI,我无法实现我想要的。
那么,该如何应对呢?
angular - 如何仅在一个特定的 NgModule 中添加 http 拦截器(没有延迟加载)?
我需要实现一些功能。我想在模块 A 和 B 中提供一些 http 拦截器。我希望从模块 A 发送的每个 http 请求都带有一些标头,例如“zone: a-feature”。来自模块 B 的任何请求都必须使用诸如“zone: b-feature”之类的标头发送。
我正在尝试使用自定义 http 拦截器来实现这一点。
这是我尝试过的:https ://stackblitz.com/edit/angular-j3siwz
- 我用 2 个组件 A 和 B 创建了 2 个模块
- 每个组件发送请求
- 每个模块都有自定义的 TOKEN 提供者
- 在 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 请求(它可以来自任何模块)?
angular - 如何以角度将服务实例注入功能模块
我想将一个服务创建的一个模块注入到第二个完全不同的模块中,这取决于第一个模块创建的一些数据。假设您将一个用于身份验证的功能模块导入到您的项目中,还导入了一个用于创建 websocket 的模块。出于身份验证的目的,您需要一个保存在本地存储中的 id,服务可以很容易地从已经创建的身份验证模块访问该 ID。在 websocket 模块中,我在forRoot
方法中提供了一个配置,因此可以定义套接字端点,以及已经从身份验证模块创建的身份验证服务实例。
现在我的问题是:如何获取此服务实例以及如何将其注入到 websocket 模块的配置中?
angular - 在 Angular 中动态提供服务
我有一个 DI 问题,我试图在不使代码臃肿的情况下解决:
设置如下:
我有一个基本表单类“A”,它与使用服务“B”的一些子组件进行通信。
类“A”有许多(比如 50 个)继承表单组件,如果我想为每个组件提供服务,我将不得不通过每个组件声明并提供服务“B”。
那么,为什么不只提供你问的 root 呢?好吧,这项服务需要在表单存在的同时存在,尽管有可能,但它需要我跟踪表单的生命周期并在停用警卫时清除服务......这不是解决问题的一种非常强大的方法问题(可以这么说......)。
我想到的另一个想法是提供服务......动态......但我认为这不受支持/在Angular中做事的方式?可能这只是不支持。
我可以提供一个服务定位器模式,但这只会与现有的 DI 竞争。
angular - 在自定义 Angular 验证器中注入 Angular 服务
我在 Angular 中创建了一个自定义验证器。我在验证器validateFund
函数中使用了 Angular 服务。但是,Angular 提供了一个新的服务实例;当我尝试验证数据时,我的验证总是失败,因为服务实例是新的并且没有服务的其他实例中存在的数据。
这是验证器:
angular - Angular:如果我们将 .js 或 .ts 放在 import 语句的末尾,则依赖注入不会正确发生
典型的导入语句如下所示:
如果我在构造函数中自动装配HelpService
,我会得到一个现有的HelpService
. 但是,如果我这样导入它:
现在,我收到了一个全新的服务实例,而不是现有的实例。为什么会这样?
angular - 如何将动态变量从服务传递给 http_interceptor
我有多个角度项目,每个项目都有一个调用相同 API 的服务。我一直在向请求添加一个标头,以确定从哪个应用程序发送了请求。所以我一直在尝试创建一个具有基本服务类的库来设置标头值
和一个http 拦截器,用于将该动态值作为标头附加到请求中
最后是一个将动态值设置为提供者的工厂
但我不知道如何在模块中设置提供程序并低于错误,这不是很有帮助。
有人可以指出我正确的方向吗?
谢谢你。