当 Angular 4.0.2 应用程序被提前编译时,提供者被定义为useValue
import { OpaqueToken, Provider } from '@angular/core';
export const windowToken = new OpaqueToken('window');
export const windowProvider = { provide: windowToken, useValue: window };
并像使用
@NgModule({ providers: [windowProvider], ... })
export class AppModule {}
它编译正常,但在window
注入undefined
时导致
constructor(@Inject(windowToken) window) {
window.navigator...
}
引导时引发错误:
TypeError:无法读取未定义的属性“导航器”
仔细查看自动生成的 app.module.ngfactory.js 似乎确实是undefined
:
...
import * as import39 from './window';
var AppModuleInjector = (function (_super) {
...
AppModuleInjector.prototype.createInternal = function () {
...
this._windowToken_26 = undefined;
this._SomeService_27 = new import16.SomeService(this._windowToken_26);
}
AppModuleInjector.prototype.getInternal = function (token, notFoundResult) {
...
if ((token === import39.windowToken)) {
return this._windowToken_26;
}
...
当使用相同的服务时useFactory
,一切正常:
export function windowFactory() {
return window;
}
export const windowProvider = { provide: windowToken, useFactory: windowFactory };
window
在这里使用作为提供者到底有什么问题useValue
?这是一个已知的陷阱吗?此限制是否适用于所有全局变量或所有useValue
提供程序?