问题标签 [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 投票
2 回答
833 浏览

angular - Angular——在哪里提供服务?

如果我想在一个模块中隔离服务,我应该为模块创建一个根组件,并providers在这个组件上使用(如所述文档)。

如果我providers在模块上使用,服务将成为应用程序级别。因此,这是提供应用程序级服务的一种方式(如示例中所做的那样

但是,接下来,文档说

不要在共享模块中指定应用程序范围的单例提供程序。导入该共享模块的延迟加载模块将制作自己的服务副本。

所以,我们不应该使用providers模块来提供共享服务。那么,我们应该使用什么?应用模块providers?我们应该在 AppModule 中提供所有共享服务吗?什么时候应该使用providers功能模块?

看起来,模块提供程序是共享的,但您不应该将它们用作共享。怎么回事?

0 投票
1 回答
271 浏览

angular - 如果像这样使用 `private fb: FormBuilder`,为什么 `FormBuilder` 的 DI 会失败

我正在尝试将这样的FormBuilder类注入组件:

但是,它失败了,我得到了错误:

(SystemJS)无法解析任务组件的所有参数:(?)。↵错误:无法解析任务组件的所有参数:(?)。

如果我将构造函数更改为这种形式:

它工作正常。有什么问题?

0 投票
1 回答
77 浏览

angular - 如何单独使用角度DI

这篇文章指出:

现有的 DI (angular1) 有一些问题:

内置到框架中——Angular 1 的 DI 直接嵌入到框架中。我们没有办法将它解耦为一个独立的系统。

如何将 angular2 DI 用作独立系统?据我了解,它没有作为单独的包发布。

0 投票
1 回答
660 浏览

angular - 惰性模块是否创建根注入器的子注入器

假设我有以下内容LazyModule被延迟加载并在其中LazyComponent声明:

我的理解是,当加载LazyModuleAngular 时,将为这个模块创建一个子注入器rootInjector,如下所示:

然后LazyComponent像这样创建一个子注入器:

所以最终注入器树是这样的:

在此处输入图像描述

这是对的吗?

0 投票
2 回答
577 浏览

javascript - @Host 装饰器如何在注入器树中工作

我试图了解@Host装饰器如何与view-components 分离。所以我创建了以下注入器树:

我预计会出现错误,因为据我了解grandchild注入器的主机是child,并且注入器中没有Dependency提供child。但是,当我运行此代码时,我会'A'从根注入器中注入。为什么?

0 投票
1 回答
1605 浏览

angular - 通过 DI 启用自定义的模式

我正在查看in-memory-web-api的实现,并且有以下代码:

据我了解,模式如下:

  1. 定义类属性并在不使用 DI 的情况下实例化依赖项
  2. 可选地注入依赖项

如果用户通过 DI 提供修改后的依赖项,它将被注入,并且没有 DI 实例化的默认依赖项将被覆盖。我怀疑模块RequestOptions中可能有类似的东西。HTTP

这是一种常见的模式吗?

编辑

事实证明,这in-memory-web-api并不完全是我要问的模式。假设,我有一个类A使用B可注入的类实例和 token B。所以他们都注册了根注入器:

提供者:[A,B]

现在,如果用户想要自定义B,他可以在同一个令牌下注册自定义版本,从而有效地覆盖原来的B

这是如何RequestOptionshttp模块中扩展的。

0 投票
2 回答
18391 浏览

angular - Angular2作为组件输入的传递函数不起作用

我有一个将函数作为输入的组件。我已经从父级传递了这个函数。

尽管调用了该函数,但该函数无法访问声明该函数的实例的依赖关系。

这是组件

这是组件的使用方式

当我运行这个应用程序时,我在控制台中收到一条错误消息Cannot read property 'getVal' of undefined

这是这个问题的一个小问题。

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

0 投票
1 回答
3889 浏览

angular - 对使用 Injector 和 Router(和其他服务)的父类进行单元测试

假设我有一个类Foo为其所有派生类提供依赖注入服务,例如:

它具有从它派生的类:

如何正确地对父类进行单元测试,而不会遇到:

Error: Can't resolve all parameters for Foo: (?)

此刻我有(尝试了很多很多不同的方法来让它工作,但是失败了:()

我也尝试过ReflectiveInjector.resolveAndCreate这样使用:

但仍然没有骰子:(有什么想法吗?

0 投票
1 回答
3528 浏览

angular - 角。使用 APP_INITIALIZER 时路由器 DI 不工作

我正在通过APP_INITIALIZER以下方式从服务器预加载应用程序配置AppModule

然后,ApiService手动注入ConfigService

注入时finallyrouter是未定义的ApiService

在此处输入图像描述

这是plunker

有什么想法可以解决/解决它吗?

0 投票
1 回答
2124 浏览

angular - Angular 2 将服务注入服务

在我的应用程序中,我使用我们自己的实现扩展了 Angular Http 类,该实现添加了一些标头。

然后,在 app.mobule.ts 文件中,我已经这样做了,所以每次都使用我们的安全版本而不是基本版本:

现在,在我们的服务中,我们使用标准的构造函数/DI 方法:

现在我的问题是,SecurityService 还需要注入 Secure_Http 类/服务,因为那里需要一个函数来获取 JWT。

但是,一旦我将 Secure_Http 类/服务添加为构造函数参数,我就会收到错误消息No provider for Secure_Http

因此,我的下一个想法是将 Secure_Http 添加到 app.module.ts 文件中的 providers 部分,就在我指定 Http 需要使用 Secure_Http 的位置旁边。但是一旦我这样做,我就会得到错误No provider for ConnectionBackend。如果我转身添加ConnectionBackend到提供程序中,那么@NgModule 上就会出现错误Type 'typeof ConnectionBackend' is not assignable to type provider

我在哪里错了?我只有一种方法需要直接访问 Secure_Http 类。这是必需的,因为它需要成为我的一个帖子调用的参数。我不能只从 Secure_Http 服务/类中调用它,因为参数已经传递......