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.@Inject
saya mendapatkanNo provider for Window
kesalahan. Cukup bagus tidak membutuhkan manual@Inject
!@Inject(Window)
ini untuk bekerjawindow
, tetapi dengan layanan di antaranya memungkinkan mematikanwindow
barang asli dalam pengujian unit, dan saat Anda menyebutkan untuk SSR, layanan alternatif dapat disediakan yang memperlihatkan jendela tiruan / noop untuk server. Alasan saya menyebutkan AOT adalah beberapa solusi awal untuk membungkus jendela rusak di AOT ketika Angular diperbarui.Dengan rilis NgModule sudut 2.0.0-rc.5 diperkenalkan. Solusi sebelumnya berhenti berfungsi untuk saya. Inilah yang saya lakukan untuk memperbaikinya:
app.module.ts:
Di beberapa komponen:
Anda juga bisa menggunakan OpaqueToken alih-alih string 'Window'
Edit:
AppModule digunakan untuk mem-bootstrap aplikasi Anda di main.ts seperti ini:
Untuk informasi lebih lanjut tentang NgModule, baca dokumentasi Angular 2: https://angular.io/docs/ts/latest/guide/ngmodule.html
sumber
Anda bisa menyuntikkannya setelah Anda mengatur penyedia:
sumber
window.var
konten halaman tidak berubahAnda bisa mendapatkan jendela dari dokumen yang diinjeksi.
sumber
Untuk membuatnya bekerja pada Angular 2.1.1 saya harus melakukan
@Inject
window menggunakan stringdan kemudian mengejeknya seperti ini
dan secara biasa
@NgModule
saya memberikannya seperti inisumber
Di Angular RC4, karya-karya berikut adalah kombinasi dari beberapa jawaban di atas, di app.ts root Anda menambahkan penyedia:
Kemudian dalam layanan Anda, dll, masukkan ke konstruktor
sumber
Sebelum deklarasi @Component, Anda juga dapat melakukannya,
Kompiler sebenarnya akan membiarkan Anda mengakses variabel global window sekarang karena Anda mendeklarasikannya sebagai variabel global yang diasumsikan dengan tipe any.
Saya tidak akan menyarankan untuk mengakses jendela di mana pun di aplikasi Anda, Anda harus membuat layanan yang mengakses / memodifikasi atribut jendela yang diperlukan (dan menyuntikkan layanan tersebut ke dalam komponen Anda) untuk mengetahui apa yang dapat Anda lakukan dengan jendela tersebut tanpa membiarkan mereka mengubah seluruh objek jendela.
sumber
Saya menggunakan OpaqueToken untuk string 'Window':
Dan digunakan hanya untuk mengimpor
WINDOW_PROVIDERS
dalam bootstrap di Angular 2.0.0-rc-4.Tetapi dengan rilis Angular 2.0.0-rc.5 saya perlu membuat modul terpisah:
dan baru saja ditentukan di properti impor utama saya
app.module.ts
sumber
Mulai hari ini (April 2016), kode dalam solusi sebelumnya tidak berfungsi, saya pikir dimungkinkan untuk menyuntikkan jendela langsung ke App.ts dan kemudian mengumpulkan nilai yang Anda butuhkan ke layanan untuk akses global di Aplikasi, tetapi jika Anda lebih suka membuat dan memasukkan layanan Anda sendiri, solusi cara yang lebih sederhana adalah ini.
https://gist.github.com/WilldelaVega777/9afcbd6cc661f4107c2b74dd6090cebf
sumber
Angular 4 memperkenalkan InjectToken, dan mereka juga membuat token untuk dokumen yang disebut DOKUMEN . Saya pikir ini adalah solusi resmi dan berfungsi di AoT.
Saya menggunakan logika yang sama untuk membuat perpustakaan kecil yang disebut ngx-window-token untuk mencegah melakukan ini berulang kali.
Saya telah menggunakannya di proyek lain dan membangun AoT tanpa masalah.
Berikut adalah cara saya menggunakannya di paket lain
Ini plunkernya
Di modul Anda
imports: [ BrowserModule, WindowTokenModule ]
Di komponen Andaconstructor(@Inject(WINDOW) _window) { }
sumber
Inilah solusi lain yang saya temukan baru-baru ini setelah saya bosan mendapatkan
defaultView
dariDOCUMENT
token bawaan dan memeriksanya untuk null:sumber
@Inject(WINDOW) private _window: any
dan menggunakannya seperti token injeksi DOKUMEN yang disediakan oleh Angular?Itu cukup untuk dilakukan
dan lakukan
untuk membuat AOT bahagia
sumber
Ada peluang untuk akses langsung ke objek jendela melalui dokumen
sumber
Saya tahu pertanyaannya adalah bagaimana menyuntikkan objek jendela ke dalam komponen tetapi Anda melakukan ini hanya untuk sampai ke localStorage tampaknya. Jika Anda benar-benar hanya menginginkan localStorage, mengapa tidak menggunakan layanan yang mengekspos hal itu, seperti h5webstorage . Kemudian komponen Anda akan mendeskripsikan dependensi sebenarnya yang membuat kode Anda lebih mudah dibaca.
sumber
Ini adalah jawaban terpendek / terbersih yang saya temukan bekerja dengan Angular 4 AOT
Sumber: https://github.com/angular/angular/issues/12631#issuecomment-274260009
sumber
Anda dapat menggunakan NgZone di Angular 4:
sumber
Sebaiknya tandai
DOCUMENT
sebagai opsional. Per the Angular docs:Berikut adalah contoh penggunaan
DOCUMENT
untuk melihat apakah browser memiliki dukungan SVG:sumber
@maxisam terima kasih untuk ngx-window-token . Saya melakukan hal serupa tetapi beralih ke milik Anda. Ini adalah layanan saya untuk mendengarkan acara mengubah ukuran jendela dan memberi tahu pelanggan.
Pendek dan manis dan bekerja seperti pesona.
sumber
Mendapatkan objek jendela melalui DI (Dependency Injection) bukanlah ide yang baik ketika variabel global dapat diakses di seluruh aplikasi.
Namun jika Anda tidak ingin menggunakan objek jendela maka Anda juga dapat menggunakan
self
kata kunci yang juga mengarah ke objek jendela.sumber
Tetap sederhana, kawan!
sumber
Sebenarnya sangat mudah untuk mengakses objek jendela di sini adalah komponen dasar saya dan saya mengujinya berfungsi
sumber