Manfaat Injeksi Ketergantungan (DI) tidak akan dibahas lagi, dan mereka yang telah menggunakan kerangka kerja Spring tahu itu. Sebagai kerangka kerja JS latar depan, AngularJS juga menyediakan dukungan untuk DI, yang merupakan fitur yang tidak dimiliki JavaScript/JQuery. Di terkait dengan angularjs termasuk angular.module (), Angular.Injector (), $ injektor, dan $ menyediakan. Untuk wadah DI, ia harus memiliki tiga elemen: pendaftaran layanan, deklarasi ketergantungan, dan akuisisi objek. Misalnya, di musim semi, pendaftaran layanan diimplementasikan melalui tag <sean> dari file konfigurasi XML atau annotation @repository, @service, @controller, dan @component; Akuisisi objek dapat diimplementasikan oleh ApplicationContext.getBean (); Deklarasi dependensi dapat dikonfigurasi dalam file XML, atau dapat dinyatakan dalam kode Java menggunakan @Resource dan anotasi lainnya. Dalam Angular, Modul dan $ menyediakan setara dengan pendaftaran Layanan; injektor digunakan untuk mendapatkan objek (sudut akan secara otomatis menyelesaikan injeksi dependensi); Ada 3 cara untuk menyatakan dependensi dalam sudut. Berikut ini adalah pengantar di sudut DI dari 3 aspek ini.
1. Angular.module () membuat, memperoleh, dan mendaftarkan modul dalam sudut
Angular.module () adalah tempat global untuk membuat, mendaftarkan, dan mengambil modul sudut. Ketika melewati dua atau lebih argumen, modul baru dibuat. Jika disahkan hanya satu argumen, modul yang ada (nama yang disahkan sebagai argumen pertama untuk modul) diambil.
// melewati lebih dari satu parameter berarti modul baru; Array kosong berarti bahwa modul tidak bergantung pada modul lain var createModule = angular.module ("mymodule", []); // Hanya ada satu parameter (nama modul), yang berarti mendapatkan modul // modul tidak ada, "kerangka sudut" akan melempar pengecualian var getModule = angulule. peringatan (createModule == getModule);Fungsi ini dapat membuat modul baru atau mendapatkan modul yang ada. Apakah akan membuat atau mendapatkan, itu dibedakan dengan jumlah parameter.
angular.module (name, [membutuhkan], [configFn]);
Nama: Jenis String, mewakili nama modul;
Membutuhkan: serangkaian string, mewakili daftar modul lain yang bergantung pada modul. Jika Anda tidak mengandalkan modul lain, gunakan array kosong;
ConfigFN: Digunakan untuk membuat beberapa konfigurasi ke modul ini.
Sekarang kita tahu cara membuat dan mendapatkan modul, jadi apa sebenarnya modul itu? Hanya ada satu kalimat pada Panduan Pengembang Resmi: Anda dapat menganggap modul sebagai wadah untuk berbagai bagian pengontrol aplikasi, layanan, filter, arahan, dll. Saya tidak begitu memahaminya sekarang. Secara kasar berarti bahwa modul adalah kumpulan beberapa fungsi, seperti keseluruhan yang terdiri dari elemen anak seperti pengontrol, layanan, filter, instruksi, dll. Saya tidak bisa menjelaskannya sekarang, jadi saya akan meninggalkannya terlebih dahulu.
2. Hubungan antara $ menyediakan dan modul
Layanan $ menyediakan memiliki sejumlah metode untuk mendaftarkan komponen dengan $ injektor. Banyak dari fungsi -fungsi ini juga terpapar pada Angular.module.
Seperti disebutkan sebelumnya: Modul dan menyediakan digunakan untuk mendaftarkan layanan ke injektor. Periksa API resmi dan Anda dapat melihat bahwa $ menyediakan menyediakan menyediakan (), konstan (), nilai (), pabrik (), dan layanan () untuk membuat layanan dari berbagai sifat; Angular.module juga menyediakan 5 metode pendaftaran layanan ini. Faktanya, fungsi keduanya persis sama, yang digunakan untuk mendaftarkan layanan dengan wadah DI ke injektor.
Otomatis di bawah API resmi termasuk $ menyediakan dan $ injektor, modul implisit yang secara otomatis ditambahkan ke setiap $ injektor. Secara harfiah, setiap injektor memiliki 2 layanan implisit ini. Tetapi dalam versi 1.2.25, saya merasa bahwa tidak ada cara untuk mendapatkan $ yang disediakan di injektor. Saya tidak tahu mengapa ini? Secara umum, Anda tidak perlu menampilkan layanan ini, cukup gunakan API yang disediakan dalam modul.
var injector = angular.Injector (); alert (injector.has ("$ incid")); // falsealert (injector.has ("$ injector")); // true3. Angular.Injector ()
Anda juga bisa mendapatkan injektor menggunakan angular.Injector (); tetapi tidak terikat pada modul. Pendekatan ini tidak ada artinya, setara dengan membuat wadah di kosong, dan tidak ada layanan di dalamnya, bagaimana orang lain dapat menggunakannya? Cara yang benar adalah dengan menentukan modul yang perlu dimuat saat membuat injektor.
// Buat Modul MyModule dan Layanan Register Var MyModule = Angular.Module ('MyModule', []); MyModule.Service ('MyService', Function () {this.my = 0;}); // Buat modul hermodule dan risalah layanan var hermodule = angululule ('hermodule (' hermodule ('hermodule (' []); hermodule.service ('herservice', function () {this.her = 1;}); // Muat layanan var injector = angular.injector (["mymodule", "hermodule"]); waspada (injector.get ("herservice"). my); waspada.Jika beberapa modul dimuat, layanan di bawah beberapa modul dapat diperoleh melalui injektor yang dikembalikan. Dalam contoh ini, jika saja myMoUdle dimuat, injektor yang diperoleh tidak dapat mengakses layanan di bawah hermoudle. Sangat penting untuk dicatat di sini: Angular.Injector () dapat disebut beberapa kali, dan setiap kali mengembalikan objek injektor yang baru dibuat.
var injector1 = angular.Injector (["mymodule", "hermodule"]); var injector2 = angular.Injector (["mymodule", "hermodule"]); waspada (injector1 == injector2); // false
4. Tiga cara untuk menyatakan ketergantungan dalam sudut
Angular menyediakan tiga cara untuk mendapatkan dependensi: inferensi, anotasi, dan metode inline.
// Buat Modul MyModule dan daftarkan layanan var myModule = angular.module ('mymodule', []); mymodule.service ('myservice', function () {this.my = 0;}); // dapatkan injectorvar injector = angular.injector (["mymodule"); inferencinjector.invoke (function (myService) {alert (myservice.my);}); // The Second AnnotationFunction Function Explicit (ServiceA) {waspada (serviceea.my);}; eksplisit. $ inject = ['myService']; injector.invoke (eksplisit); function (servicea) {alert (serviceA.my);}]);Di antara mereka, metode anotasi dan inline tidak memerlukan nama parameter fungsi, yang direkomendasikan; Metode inferensi mensyaratkan bahwa nama parameter dan nama layanan konsisten. Jika kode JS dikompresi atau dikaburkan, maka akan ada masalah dengan fungsi, dan metode ini tidak disarankan.
Di atas adalah kompilasi informasi yang disuntikkan oleh ketergantungan AngularJS. Kami akan terus menambahkan informasi yang relevan di masa mendatang. Terima kasih atas dukungan Anda untuk situs web ini!