AngularJS menggunakan Dependency Injection (DI) untuk menyuntikkan layanan / pabrik ke dalam komponen, arahan dan layanan lainnya. Jadi yang perlu Anda lakukan untuk mendapatkan layanan adalah untuk mendapatkan injektor AngularJS terlebih dahulu (injektor bertanggung jawab untuk memasang semua dependensi dan menyediakannya untuk komponen).
Untuk mendapatkan injektor aplikasi Anda, Anda perlu mengambilnya dari elemen yang ditangani sudut. Misalnya jika aplikasi Anda terdaftar pada elemen tubuh yang Anda panggilinjector = angular.element(document.body).injector()
Dari diambil injectorAnda kemudian bisa mendapatkan layanan apa pun yang Anda sukainjector.get('ServiceName')
Trik lain yang berguna untuk mendapatkan $scopeelemen tertentu. Pilih elemen dengan alat inspeksi DOM alat pengembang Anda dan kemudian jalankan baris berikut ( $0selalu elemen yang dipilih): angular.element($0).scope()
Saya juga harus melakukan ini untuk membuatnya bekerja. BTW, angular.element('*[ng-app]').injector()harus bekerja untuk semua kasus.
Francesc Rosas
4
Jika Anda mendapatkan kesalahan 'penyeleksi tidak diterapkan' mengeksekusi angular.element ('html') maka Anda dapat menggunakan fitur Chrome $ 0. Pilih elemen html, pergi ke konsol dan jalankan angular.element ($ 0) .injector ()
FYI Saya harus menggunakan document.body on chrome
Kevin
5
FYI Saya ingin menggunakan layanan $ location, tetapi akhirnya saya harus membungkusnya dengan scope.apply. Saya tahu ini didokumentasikan dengan baik, tetapi itu telah menyelinap di pikiran saya. Dalam satu baris, angular.element (document) .scope (). $ Berlaku (angular.element (document) .injector (). Get ('$ location'). Path ('/ my / angular / url'))
acid_crucifix
25
Pertama-tama, versi modifikasi dari layanan Anda.
Sebuah )
var app = angular.module('app',[]);
app.factory('ExampleService',function(){return{
f1 :function(world){return'Hello'+ world;}};});
Ini mengembalikan objek, tidak ada yang baru di sini.
Sekarang cara untuk mendapatkan ini dari konsol adalah
b)
var $inj = angular.injector(['app']);var serv = $inj.get('ExampleService');
serv.f1("World");
c)
Salah satu hal yang Anda lakukan di sana sebelumnya adalah mengasumsikan bahwa app.factory mengembalikan Anda fungsi itu sendiri atau versi yang baru. Yang tidak demikian. Untuk mendapatkan konstruktor, Anda harus melakukannya
ketika saya lakukan var $inj = angular.injector(['app']);maka konsol melempar Error: Unknown provider: $filterProvider from appdalam satu aplikasi dan Error: Unknown provider: $controllerProvider from appdi aplikasi lain ...
JustGoscha
@JustGoscha Bagaimana aplikasi Anda dikonfigurasi? yaitu Bagaimana garis (yang terlihat seperti) var app = angular.module ('app', []); terlihat seperti di aplikasi Anda.
ganaraj
Saya tidak sepenuhnya memahami pertanyaan .. sepertinya seperti yang Anda katakan angular.module('app',[]);dan kemudian ada layanan, controller dll dalam file yang berbeda dan mereka semua didefinisikan seperti angular.module('app').factory('FeatureRegistry',function(){//code here});misalnya
JustGoscha
@JustGoscha Inilah yang saya lakukan untuk menguji. Saya pergi ke docs.angularjs.org/api di chrome. Membuka konsol. Mengetik kode di bagian a dari jawaban saya dan kemudian mengetik kode di bagian b .. Anda harus melihat Hello World .. Bisakah Anda mencobanya?
ganaraj
14
@ Jawaban JustGoscha tepat, tapi itu banyak yang harus diketik ketika saya ingin akses, jadi saya menambahkan ini ke bagian bawah app.js. Maka yang harus saya ketik adalah x = getSrv('$http')untuk mendapatkan layanan http.
// @if DEBUGfunction getSrv(name, element){
element = element ||'*[ng-app]';return angular.element(element).injector().get(name);}// @endif
Kerangka kerja Dependency Angularjs bertanggung jawab untuk menyuntikkan ketergantungan modul aplikasi Anda ke pengontrol Anda. Ini dimungkinkan melalui injektornya.
Anda harus terlebih dahulu mengidentifikasi aplikasi-ng dan mendapatkan injektor terkait. Kueri di bawah ini berfungsi untuk menemukan aplikasi-ng Anda di DOM dan mengambil injektor.
angular.element('*[ng-app]').injector()
Namun, di chrome, Anda dapat mengarahkan ke target ng-aplikasi seperti yang ditunjukkan di bawah ini. dan gunakan $0retasan dan masalahangular.element($0).injector()
Setelah Anda memiliki injector, dapatkan layanan injeksi dependensi seperti di bawah ini
angular.element('*[ng-app]').injector()
harus bekerja untuk semua kasus.document
juga berfungsi:angular.element(document).injector().get('serviceName')
Pertama-tama, versi modifikasi dari layanan Anda.
Sebuah )
Ini mengembalikan objek, tidak ada yang baru di sini.
Sekarang cara untuk mendapatkan ini dari konsol adalah
b)
c)
Salah satu hal yang Anda lakukan di sana sebelumnya adalah mengasumsikan bahwa app.factory mengembalikan Anda fungsi itu sendiri atau versi yang baru. Yang tidak demikian. Untuk mendapatkan konstruktor, Anda harus melakukannya
Ini mengembalikan konstruktor ExampleService yang selanjutnya Anda harus melakukan 'baru'.
Atau sebagai alternatif,
Ini mengembalikan ExampleService () baru pada injeksi.
sumber
var $inj = angular.injector(['app']);
maka konsol melemparError: Unknown provider: $filterProvider from app
dalam satu aplikasi danError: Unknown provider: $controllerProvider from app
di aplikasi lain ...angular.module('app',[]);
dan kemudian ada layanan, controller dll dalam file yang berbeda dan mereka semua didefinisikan sepertiangular.module('app').factory('FeatureRegistry',function(){//code here});
misalnya@ Jawaban JustGoscha tepat, tapi itu banyak yang harus diketik ketika saya ingin akses, jadi saya menambahkan ini ke bagian bawah app.js. Maka yang harus saya ketik adalah
x = getSrv('$http')
untuk mendapatkan layanan http.Ini menambahkannya ke lingkup global tetapi hanya dalam mode debug. Saya memasukkannya ke dalam
@if DEBUG
sehingga saya tidak berakhir dengan itu dalam kode produksi. Saya menggunakan metode ini untuk menghapus kode debug dari build prouduction.sumber
Kerangka kerja Dependency Angularjs bertanggung jawab untuk menyuntikkan ketergantungan modul aplikasi Anda ke pengontrol Anda. Ini dimungkinkan melalui injektornya.
Anda harus terlebih dahulu mengidentifikasi aplikasi-ng dan mendapatkan injektor terkait. Kueri di bawah ini berfungsi untuk menemukan aplikasi-ng Anda di DOM dan mengambil injektor.
Namun, di chrome, Anda dapat mengarahkan ke target ng-aplikasi seperti yang ditunjukkan di bawah ini. dan gunakan
$0
retasan dan masalahangular.element($0).injector()
Setelah Anda memiliki injector, dapatkan layanan injeksi dependensi seperti di bawah ini
sumber