2016-10-24 2 views
4

В более ранних версиях RC угловых 2 я был в состоянии придать объект окна, добавивКак Inject Окно в угловые 2.1.0

{provide: Window, useValue: window}

Для массива поставщиков.

С обновлением до последней стабильной версии угловой 2 (2.1.0) это сейчас бросает ошибку консоли

compiler.umd.js:14268Uncaught Error: Can't resolve all parameters for LoginComponent: (AuthService, UserMessagesService, ?).

? в списке параметров, где я пытаюсь ввести объект Window.

+0

Я уверен, что вам не нужно вводить объект окна, так как он уже доступен по всему миру в браузере работает JS. – rinukkusu

+1

@rinukkusu Когда я тестирую свои компоненты, я должен быть в состоянии вымогать оконный объект, и при этом я предпочел бы использовать стандартный DI, который дает угловой 2 вместо того, чтобы изменять сам объект окна. Если невозможно ввести собственное окно, я, вероятно, в конечном итоге создам обертку над ним. Я просто надеялся, что мне не нужно, поскольку инъекция Window работает в предыдущей версии. – tt9

+0

Вы можете использовать это с Angular4 https://www.npmjs.com/package/ngx-window-token – maxisam

ответ

8

Попробуйте с:

@NgModule({ 
    declarations: [...], 
    imports: [...], 
    providers: [ 
    { provide: "windowObject", useValue: window} 
    ] 
}) 

экспорт класса HomeModule {}

в компоненте:

constructor(@Inject("windowObject") window: Window}) 
+0

Это отлично работает, почему-то почему они удалили возможность напрямую вводить тип окна? – tt9

+0

кажется, что объект окна не переносится ... https://github.com/angular/angular/pull/12694#issuecomment-258348560 – Zealitude

1

Для того, чтобы он работал с АОТ вам нужно сделать useFactory вместо useValue :

export function windowFactory() { 
    return window: 
} 

модуль:

providers: [ 
    { provide: 'window', useFactory: windowFactory } 
] 

компонент:

constructor(@Inject('window') window: Window}) 
Смежные вопросы