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:
Daftarkan layanan nilai dengan $ injector, seperti string, angka, array, objek atau fungsi. Ini adalah kependekan dari mendaftarkan layanan di mana properti $ get miliknya adalah fungsi pabrik yang tidak mengambil argumen dan mengembalikan layanan nilai. Itu juga berarti tidak mungkin untuk menyuntikkan layanan lain ke layanan bernilai.
Bandingkan ini dengan dokumentasi untuk module.constant
( $provide.constant
) yang juga dengan jelas menyatakan use case (penekanan milik saya):
Daftarkan layanan konstan dengan $ injector, seperti string, angka, array, objek atau fungsi. Seperti nilainya, tidak mungkin untuk menyuntikkan layanan lain ke dalam konstanta. Tetapi tidak seperti nilai, konstanta dapat disuntikkan ke fungsi konfigurasi modul (lihat angular.Module) dan tidak dapat diganti oleh dekorator AngularJS .
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
export const π = 3.14159265;
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
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
samar-samar sewenang-wenang dan sedikit tidak menyenangkan karena $provide.constant
digunakan untuk menentukan objek yang kebetulan juga merupakan konstanta. Anda mungkin juga telah menulis
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
untuk 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
export const π = 3.14159265;
seperti halnya saya menggunakan AngularJS.
Semakin banyak hal berubah ...
AppSettings
kelas Anda harus abstrak danAPI_ENDPOINT
anggota harusreadonly
.