Di Angular 1.x Anda dapat mendefinisikan konstanta seperti ini:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
Apa yang akan menjadi setara dalam Angular (dengan TypeScript)?
Saya hanya tidak ingin mengulangi url basis API berulang-ulang di semua layanan saya.
typescript
angular
AndreFeijo
sumber
sumber
AppSettings
kelas Anda harus abstrak danAPI_ENDPOINT
anggota harusreadonly
.Solusi untuk konfigurasi yang disediakan oleh tim sudut itu sendiri dapat ditemukan di sini .
Ini semua kode yang relevan:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Sekarang Anda dapat menyuntikkan konfigurasi di mana-mana tanpa menggunakan nama string dan dengan menggunakan antarmuka Anda untuk pemeriksaan statis.
Anda tentu saja dapat memisahkan Antarmuka dan konstanta lebih lanjut untuk dapat memberikan nilai yang berbeda dalam produksi dan pengembangan misalnya
sumber
environment.ts
danenvironment.prod.ts
agar Anda dapat memiliki konstanta yang berbeda per lingkungan? @IlyaChernomordik mulai menyebutkan ini pada paragraf terakhir dari jawabannya.Di Angular2, Anda memiliki definisi memberikan berikut ini , yang memungkinkan Anda untuk mengatur berbagai jenis dependensi:
Bandingkan dengan Angular 1
app.service
di Angular1 sama denganuseClass
di Angular2.app.factory
di Angular1 sama denganuseFactory
di Angular2.app.constant
danapp.value
telah disederhanakanuseValue
dengan kendala yang lebih sedikit. yaitu tidak adaconfig
blok lagi.app.provider
- Tidak ada padanan dalam Angular 2.Contohnya
Untuk mengatur dengan injektor root:
Atau pengaturan dengan injektor komponen Anda:
provide
adalah tangan pendek untuk:Dengan injector, mendapatkan nilainya mudah:
sumber
Di Angular 4, Anda bisa menggunakan kelas lingkungan untuk menjaga semua global Anda.
Anda memiliki environment.ts dan environment.prod.ts secara default.
Sebagai contoh
Dan kemudian pada layanan Anda:
sumber
const
dalam layanan, Anda mungkin harus "memberikan" di penyedia berbagai aplikasi modul Anda:{ provide: 'ConstName', useValue: ConstName }
. Saya mendapatkan kesalahan runtime tanpa ini.Diperbarui untuk Angular 4+
Sekarang kita cukup menggunakan file environment yang disediakan angular default jika proyek Anda dihasilkan melalui angular-cli.
sebagai contoh
Di folder lingkungan Anda buat file berikut
environment.prod.ts
environment.qa.ts
environment.dev.ts
dan setiap file dapat menyimpan perubahan kode terkait seperti:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Kasus penggunaan dalam aplikasi
Anda dapat mengimpor lingkungan ke file apa pun seperti layanan
clientUtilServices.ts
import {environment} from '../../environments/environment';
Kasus penggunaan dalam membangun
Buka file cli sudut Anda
.angular-cli.json
dan di dalam"apps": [{...}]
tambahkan kode berikutJika Anda ingin membangun untuk produksi, jalankan
ng build --env=prod
itu akan membaca konfigurasi darienvironment.prod.ts
, cara yang sama Anda dapat melakukannya untukqa
ataudev
## Jawaban yang lebih lama
Saya telah melakukan sesuatu seperti di bawah ini, di provider saya:
Maka saya memiliki akses ke semua data Konstan di mana saja
sumber
API_ENDPOINT
nilai Anda dapat ditulis berlebihan pada titik waktu mana pun. Jikathis.ConstantService.API_ENDPOINT = 'blah blah'
dideklarasikan di kelas kapan saja setelah apa yang Anda sebut "konstan" diimpor dariconstant-service
, nilai baru dari API_ENDPOINT adalah'blah blah'
. Solusi Anda hanya menunjukkan cara mengakses variabel menggunakan layanan dan bukan dengan menggunakan konstanta.readonly API_ENDPOINT :String;
ng build --env=prod
Walaupun pendekatan dengan memiliki kelas AppSettings dengan konstanta string saat ApiEndpoint bekerja, itu tidak ideal karena kita tidak akan dapat menukar ApiEndpoint nyata ini dengan beberapa nilai lain pada saat pengujian unit.
Kita harus dapat menyuntikkan titik akhir api ini ke layanan kami (pikirkan menyuntikkan layanan ke layanan lain). Kita juga tidak perlu membuat seluruh kelas untuk ini, semua yang ingin kita lakukan adalah menyuntikkan string ke layanan kita menjadi ApiEndpoint kita. Untuk menyelesaikan jawaban yang sangat baik dengan pixelbits , berikut adalah kode lengkap bagaimana hal itu dapat dilakukan di Angular 2:
Pertama-tama kita perlu memberi tahu Angular bagaimana memberikan instance ApiEndpoint kita ketika kita memintanya di aplikasi kita (anggap itu sebagai mendaftarkan dependensi):
Dan kemudian dalam layanan kami menyuntikkan ApiEndpoint ini ke konstruktor layanan dan Angular akan menyediakannya untuk kami berdasarkan pendaftaran kami di atas:
sumber
Ini adalah pengalaman terakhir saya dengan skenario ini:
Saya telah mengikuti dokumen resmi dan yang diperbarui di sini:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Sepertinya OpaqueToken sekarang sudah usang dan kita harus menggunakan InjectionToken , jadi ini adalah file saya yang berjalan seperti pesona:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
Hasilnya bersih dan tidak ada peringatan pada konsol terima kasih atas komentar terbaru John Papa dalam masalah ini:
https://github.com/angular/angular-cli/issues/2034
Kuncinya diimplementasikan dalam file antarmuka yang berbeda.
sumber
Semua solusi tampaknya rumit. Saya mencari solusi paling sederhana untuk kasus ini dan saya hanya ingin menggunakan konstanta. Konstanta itu sederhana. Adakah yang menentang solusi berikut ini?
app.const.ts
app.service.ts
sumber
Cukup gunakan konstanta naskah
Anda dapat menggunakannya di injector ketergantungan menggunakan
sumber
const
yestJika Anda menggunakan Webpack , yang saya sarankan, Anda dapat mengatur konstanta untuk lingkungan yang berbeda. Ini sangat berharga ketika Anda memiliki nilai konstan yang berbeda pada basis per lingkungan.
Anda mungkin memiliki beberapa file webpack di bawah
/config
direktori Anda (mis., Webpack.dev.js, webpack.prod.js, dll.). Maka Anda akan memilikicustom-typings.d.ts
Anda akan menambahkannya di sana. Berikut pola umum yang harus diikuti di setiap file dan penggunaan sampel dalam Komponen.paket web. {env} .js
custom-typings.d.ts
Komponen
sumber
Menggunakan file properti yang dihasilkan selama membangun sederhana dan mudah. Ini adalah pendekatan yang menggunakan CLI Angular. Tentukan file properti untuk setiap lingkungan dan gunakan perintah saat membangun untuk menentukan file mana yang akan disalin ke aplikasi Anda. Kemudian cukup impor file properti untuk digunakan.
https://github.com/angular/angular-cli#build-targets-and-environment-files
sumber
Satu pendekatan untuk Angular4 akan mendefinisikan konstanta di tingkat modul:
Kemudian, dalam layanan Anda:
sumber
Saya punya cara lain untuk mendefinisikan konstanta global. Karena jika kita mendefinisikan dalam file ts, jika membangun dalam mode produksi tidak mudah untuk menemukan konstanta untuk mengubah nilai.
Di folder aplikasi, saya menambahkan folder configs / setting.json
Konten di setting.json
Dalam modul aplikasi tambahkan APP_INITIALIZER
dengan cara ini, saya dapat mengubah nilai dalam file json lebih mudah. Saya juga menggunakan cara ini untuk pesan kesalahan / peringatan yang konstan.
sumber
AngularJS
module.constant
tidak mendefinisikan konstanta dalam arti standar.Meskipun berdiri sendiri sebagai mekanisme registrasi penyedia, paling baik dipahami dalam konteks fungsi terkait
module.value
($provide.value
). Dokumentasi resmi menyatakan use case dengan jelas:Bandingkan ini dengan dokumentasi untuk
module.constant
($provide.constant
) yang juga dengan jelas menyatakan use case (penekanan milik saya):Oleh karena itu,
constant
fungsi AngularJS tidak memberikan konstanta dalam arti yang umum dipahami dari istilah di lapangan.Yang mengatakan pembatasan ditempatkan pada objek yang disediakan, bersama dengan ketersediaan sebelumnya melalui $ injector, jelas menunjukkan bahwa nama tersebut digunakan oleh analogi.
Jika Anda menginginkan konstanta aktual dalam aplikasi AngularJS, Anda akan "memberikan" satu cara yang sama seperti pada program JavaScript apa pun yang
Dalam Angular 2, teknik yang sama berlaku.
Aplikasi Angular 2 tidak memiliki fase konfigurasi dalam arti yang sama dengan aplikasi AngularJS. Selain itu, tidak ada mekanisme dekorator layanan ( AngularJS Dekorator ) tetapi ini tidak terlalu mengejutkan mengingat betapa berbedanya mereka satu sama lain.
Contoh dari
samar-samar sewenang-wenang dan sedikit tidak menyenangkan karena
$provide.constant
digunakan untuk menentukan objek yang kebetulan juga merupakan konstanta. Anda mungkin juga telah menulisuntuk semua bisa berubah.
Sekarang argumen untuk testabilitas, mengejek konstanta, berkurang karena secara harfiah tidak berubah.
Seseorang tidak mengejek π.
Tentu saja semantik khusus aplikasi Anda mungkin titik akhir Anda dapat berubah, atau API Anda mungkin memiliki mekanisme failover yang tidak transparan, sehingga masuk akal jika titik akhir API berubah dalam keadaan tertentu.
Tetapi dalam kasus itu, menyediakannya sebagai string string representasi dari satu URL ke
constant
fungsi tidak akan berfungsi.Argumen yang lebih baik, dan kemungkinan satu lagi selaras dengan alasan keberadaan
$provide.constant
fungsi AngularJS adalah bahwa, ketika AngularJS diperkenalkan, JavaScript tidak memiliki standar konsep modul . Dalam hal itu, global akan digunakan untuk berbagi nilai, bisa berubah atau tidak berubah, dan menggunakan global adalah masalah.Yang mengatakan, menyediakan sesuatu seperti ini melalui suatu kerangka kerja meningkatkan kopling ke kerangka itu. Ini juga mencampur logika spesifik sudut dengan logika yang akan bekerja di sistem lain.
Ini bukan untuk mengatakan itu adalah pendekatan yang salah atau berbahaya, tetapi secara pribadi, jika saya ingin konstan dalam aplikasi Angular 2, saya akan menulis
seperti halnya saya menggunakan AngularJS.
Semakin banyak hal berubah ...
sumber
Cara terbaik untuk membuat konstanta lebar aplikasi di Angular 2 adalah dengan menggunakan file environment.ts. Keuntungan dari mendeklarasikan konstanta tersebut adalah Anda dapat memvariasikannya sesuai dengan lingkungan karena dapat ada file lingkungan yang berbeda untuk setiap lingkungan.
sumber
Anda bisa membuat kelas untuk variabel global Anda dan kemudian mengekspor kelas ini seperti ini:
Setelah membuat dan mengekspor
CONSTANT
kelas Anda, Anda harus mengimpor kelas ini di kelas yang ingin Anda gunakan, seperti ini:Anda dapat menggunakan ini di
constructor
ataungOnInit(){}
, atau dalam metode standar apa pun.sumber