Saya ingin beberapa variabel untuk dapat diakses di mana-mana dalam Angular 2
dalam Typescript
bahasa. Bagaimana saya harus menyelesaikan ini?
typescript
angular
supercobra
sumber
sumber
Uncaught ReferenceError: Settings is not defined
. KelasSettings
dengan variabel statis publik diatur untuk mengekspor dan mengimpor tempat yang digunakan.Jawaban:
Berikut adalah solusi yang paling sederhana w / o
Service
atauObserver
:Masukkan variabel global dalam file dan ekspor.
Untuk menggunakan global dalam file lain gunakan
import
pernyataan:import * as myGlobals from 'globals';
Contoh:
Terima kasih @ eric-martinez
sumber
import * as globs from 'globals'
export const
alih-alihexport var
- Anda benar-benar ingin memastikan variabel global tidak dapat diubahimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
Saya suka solusi dari @supercobra juga. Saya hanya ingin sedikit meningkatkannya. Jika Anda mengekspor objek yang berisi semua konstanta, Anda hanya bisa menggunakan ES6 impor modul tanpa menggunakan membutuhkan .
Saya juga menggunakan Object.freeze untuk membuat properti menjadi konstanta yang benar. Jika Anda tertarik dengan topik ini, Anda dapat membaca posting ini .
Rujuk modul menggunakan impor.
sumber
Layanan bersama adalah pendekatan terbaik
Tetapi Anda harus sangat berhati-hati saat mendaftar untuk dapat berbagi satu contoh untuk seluruh aplikasi Anda. Anda perlu mendefinisikannya saat mendaftarkan aplikasi Anda:
tetapi tidak untuk mendefinisikannya lagi dalam
providers
atribut komponen Anda:Kalau tidak, instance baru dari layanan Anda akan dibuat untuk komponen dan sub komponennya.
Anda dapat melihat pertanyaan ini mengenai bagaimana injeksi ketergantungan dan injektor hirarki bekerja di Angular2:
Anda dapat melihat bahwa Anda juga dapat menentukan
Observable
properti di layanan untuk memberi tahu bagian dari aplikasi Anda ketika properti global Anda berubah:Lihat pertanyaan ini untuk lebih jelasnya:
sumber
HTTP_PROVIDERS
dan serupa, haruskah mereka juga tidak ditambahkanbootstrap()
?bootstrap()
tetapi dalam prakteknya itu tidak masalah. Saya pikir daftar merekaboostrap()
membuat kode lebih mudah dimengerti. Komponen memiliki penyedia, arahan, templat. Saya menemukan ini kelebihan beban tanpa penyedia global terdaftar di sana juga. Karena itu saya lebih sukabootstrap()
.alert(globalVar)
menghasilkan kesalahan.Lihat misalnya Angular 2 - Implementasi layanan bersama
atau berikan nilai individual
sumber
bootstrap()
.bootstrap()
dan komponen root adalah dua hal yang berbeda. Ketika Anda menelepon,bootstrap(AppComponent, [MyService])
Anda mendaftar layananboostrap()
danAppComponent
merupakan komponen root. Dokumen menyebutkan suatu tempat yang lebih disukai untuk mendaftar penyedia (layanan) dalam komponen rootproviders: ['MyService']
tetapi saya belum menemukan argumen yang mendukung atau menentangbootstrap()
atau komponen root.Buat kelas Globals di app / globals.ts :
Di komponen Anda:
Catatan : Anda dapat menambahkan penyedia layanan Globals secara langsung ke modul alih-alih komponen, dan Anda tidak perlu menambahkan sebagai penyedia ke setiap komponen dalam modul itu.
sumber
Globals
dengan menambahkannyaproviders: [ ... ]
berarti Anda tidak dapat mengubah nilai di dalam satu komponen dan kemudian meminta nilai yang diperbarui di dalam komponen kedua. Setiap kali Anda menyuntikkannyaGlobals
adalah contoh baru. Jika Anda ingin mengubah perilaku ini, cukup JANGAN tambahkanGlobals
sebagai penyedia.@Injectable()
IMHO untuk Angular2 (v2.2.3) cara terbaik adalah menambahkan layanan yang berisi variabel global dan menyuntikkan mereka ke dalam komponen tanpa
providers
tag di dalam@Component
anotasi. Dengan cara ini Anda dapat berbagi informasi antar komponen.Layanan sampel yang memiliki variabel global:
Komponen sampel yang memperbarui nilai variabel global Anda:
Komponen sampel yang membaca nilai variabel global Anda:
sumber
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
file modul induk. Terima kasih.Saya tidak tahu cara terbaik, tetapi cara termudah jika Anda ingin mendefinisikan variabel global di dalam komponen adalah dengan menggunakan
window
variabel untuk menulis seperti ini:window.GlobalVariable = "what ever!"
Anda tidak perlu meneruskannya ke bootstrap atau mengimpornya ke tempat lain, dan dapat diakses secara global ke semua JS (tidak hanya komponen sudut 2).
sumber
Itulah cara saya menggunakannya:
global.ts
untuk menggunakannya impor saja seperti itu:
Diedit: Droped "_" diawali seperti yang direkomendasikan.
sumber
Saya pikir cara terbaik adalah berbagi objek dengan variabel global di seluruh aplikasi Anda dengan mengekspor dan mengimpornya di tempat yang Anda inginkan.
Pertama buat file .ts baru misalnya globals.ts dan deklarasikan objek. Saya memberinya tipe Objek tetapi Anda juga bisa menggunakan tipe apa pun atau {}
Setelah itu impor saja
Dan gunakan itu
sumber
Saya suka jawaban @supercobra, tetapi saya akan menggunakan kata kunci const seperti di ES6 yang sudah tersedia:
sumber