【发布时间】:2016-09-22 05:50:52
【问题描述】:
我已经阅读了互联网上关于不透明令牌的几乎所有内容,并且认为我不能通过这本书来做更多的事情。
我想要的功能:
我有一个常量对象。我希望该对象在应用程序范围内是可注入的。
export const Constants = {...key/vals...}
非常简单。 我创建了一个 OpaqueToken 以允许我使这个 Constant 对象可注入:
import {OpaqueToken} from '@angular/core';
export const AppConstants = new OpaqueToken('AppConstants');
也很简单。
在我的根模块定义中,我导入了 OpaqueToken 和我的常量对象,并使用映射文字将它们放入 providers 数组中:
import {Constants} from '....';
import {AppConstants} from '....';
@NgModule({
...
providers: [
{provide: AppConstants, useValue: Constants}
],
...
})
好的,棒极了。现在,在我导入的任何模块中,如果我了解整个“服务全球可用”的内容,我应该能够执行以下操作:
import {AppConstants} from '.....';
@Injectable()
export class MyCoolClass {
constructor(@Inject(AppConstants) private constants:any) {
}
someMethod(){
let myVar = this.constants['someValue'];
}
}
这编译得很好(我正在使用 Webpack)。但是,在运行时我得到:
EXCEPTION: Error in ./App class App_Host - inline template:0:0 caused by: Cannot read property 'someValue' of null
显然,这已被简化,因此您可以更轻松地阅读它,但我实际上只是在切换变量名称。
我对这里的 DI 有什么不明白的地方? OpaqueToken 应该是解决将固定值注入构造函数的问题,我想,我认为 @Inject 是这样做的方法。
有人知道为什么我的 Constants 对象的值会返回 null 吗?
感谢您的帮助!
【问题讨论】:
-
看起来还可以,至少涉及到 OpaqueToken 的部分。无论如何,
null没有正当理由。是否没有其他错误会阻止正常执行?您可以使用 SystemJS 在 plunker 上重新创建问题吗?另请参阅this check list。 -
好的,这就是我一直遇到的问题(webpack?Angular?)——桶导入“一直”不起作用。我将我的导入语句更改为显式的完整路径导入,并且它起作用了。这是我不时发现的(可能有 30-50% 的时间),在某些情况下,桶装进口不起作用,没有明显的韵律或原因。嗯.....无论如何,已修复。
标签: angular dependency-injection