Ini berfungsi untuk saya saat ini (2018-03, angular 5.2 dengan AoT, diuji dalam angular-cli dan build webpack kustom):
Pertama, buat layanan injeksi yang menyediakan referensi ke jendela:
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();
}
}
Sekarang, daftarkan layanan itu dengan AppModule root Anda sehingga dapat disuntikkan di mana saja:
import { WindowRefService } from './window-ref.service';
@NgModule({
providers: [
WindowRefService
],
...
})
export class AppModule {}
dan kemudian di mana Anda perlu menyuntikkan 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;
}
...
Anda mungkin juga ingin menambahkan nativeDocument
dan layanan global lainnya ke layanan ini dengan cara yang sama jika Anda menggunakannya dalam aplikasi Anda.
edit: Diperbarui dengan saran Truchainz. edit2: Diperbarui untuk sudut 2.1.2 edit3: Menambahkan catatan AoT edit4: Menambahkan any
jenis solusi catatan edit5: Solusi yang diperbarui untuk menggunakan WindowRefService yang memperbaiki kesalahan yang saya dapatkan saat menggunakan solusi sebelumnya dengan edit versi yang berbeda6: menambahkan contoh pengetikan Jendela khusus
ORIGINAL EXCEPTION: No provider for Window!
. Namun, menghapusnya memperbaiki masalah bagi saya. Hanya menggunakan 2 baris global pertama sudah cukup bagi saya.