Когда приложение 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
провайдерам?
private
создает свойство, и размещение его перед@Inject
является синтаксической ошибкой. - person Aluan Haddad   schedule 17.04.2017