Esto me funciona actualmente (2018-03, angular 5.2 con AoT, probado en angular-cli y una compilación de paquete web personalizado):
Primero, cree un servicio inyectable que proporcione una referencia a la ventana:
import { Injectable } from '@angular/core';
// This interface is optional, showing how you can add strong typings for custom globals.
// Just use "Window" as the type if you don't have custom global stuff
export interface ICustomWindow extends Window {
__custom_global_stuff: string;
}
function getWindow (): any {
return window;
}
@Injectable()
export class WindowRefService {
get nativeWindow (): ICustomWindow {
return getWindow();
}
}
Ahora, registre ese servicio con su AppModule raíz para que pueda inyectarse en todas partes:
import { WindowRefService } from './window-ref.service';
@NgModule({
providers: [
WindowRefService
],
...
})
export class AppModule {}
y luego donde necesitas inyectar window
:
import { Component} from '@angular/core';
import { WindowRefService, ICustomWindow } from './window-ref.service';
@Component({ ... })
export default class MyCoolComponent {
private _window: ICustomWindow;
constructor (
windowRef: WindowRefService
) {
this._window = windowRef.nativeWindow;
}
public doThing (): void {
let foo = this._window.XMLHttpRequest;
let bar = this._window.__custom_global_stuff;
}
...
También es posible que desee agregar nativeDocument
y otros globales a este servicio de una manera similar si los usa en su aplicación.
editar: actualizado con sugerencia de Truchainz. edit2: Actualizado para angular 2.1.2 edit3: Se agregaron notas de AoT edit4: Añadiendo el any
tipo de nota de solución alternativa edit5: Solución actualizada para usar un WindowRefService que corrige un error que recibía al usar la solución anterior con una compilación diferente edit6: agregando un ejemplo de escritura de ventana personalizada
ORIGINAL EXCEPTION: No provider for Window!
. Sin embargo, quitarlo solucionó el problema. Usar solo las 2 primeras líneas globales fue suficiente para mí.@Inject
que aparecieranNo provider for Window
errores. ¡Eso es bastante bueno no necesitar el manual@Inject
!@Inject(Window)
para que esto funcionarawindow
, pero con el servicio intermedio permite eliminarwindow
cosas nativas en pruebas unitarias, y como mencionas para SSR, se puede proporcionar un servicio alternativo que expone una ventana simulada / noop para el servidor. La razón por la que menciono AOT es que varias de las primeras soluciones para envolver la ventana se rompieron en AOT cuando se actualizó Angular.