Pertanyaan utama - apakah mungkin? Saya mencoba tetapi tidak berhasil ..
app.js utama
...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {
}]);
...
penyedia itu sendiri
var services = angular.module('services', []);
services.provider('custom', function ($http) {
});
Dan saya mendapat kesalahan seperti itu:
Uncaught Error: Unknown provider: $http from services
Ada ide?
Terima kasih!
javascript
angularjs
angular-services
Kosmetika
sumber
sumber
app.config
bagianJawaban:
Intinya adalah:
Rincian:
Kerangka sudut memiliki proses inisialisasi 2 fase:
TAHAP 1: Konfigurasi
Selama
config
fase ini semua penyedia diinisialisasi dan semuaconfig
bagian dijalankan. Theconfig
bagian mungkin berisi kode yang mengkonfigurasi benda penyedia dan karena itu mereka dapat disuntik dengan benda penyedia. Namun, karena penyedia adalah pabrik untuk objek layanan dan pada tahap ini penyedia tidak sepenuhnya diinisialisasi / dikonfigurasi -> Anda tidak dapat meminta penyedia untuk membuat layanan untuk Anda pada tahap ini -> pada tahap konfigurasi Anda tidak dapat menggunakan / layanan suntik . Saat fase ini selesai, semua penyedia sudah siap (tidak ada lagi konfigurasi penyedia yang dapat dilakukan setelah fase konfigurasi selesai).TAHAP 2: Jalankan
Selama
run
fase semuarun
bagian dieksekusi. Pada tahap ini penyedia sudah siap dan dapat membuat layanan -> selamarun
tahap Anda dapat menggunakan / menyuntikkan layanan .Contoh:
1. Menyuntikkan
$http
layanan ke fungsi inisialisasi penyedia TIDAK AKAN berfungsiKarena kami mencoba menyuntikkan
$http
layanan ke dalam fungsi yang dijalankan selamaconfig
fase, kami akan mendapatkan kesalahan:Apa yang sebenarnya dikatakan kesalahan ini adalah bahwa
$httpProvider
yang digunakan untuk membuat$http
layanan belum siap (karena kita masih dalamconfig
fase).2. Menyuntikkan
$http
layanan ke fungsi inisialisasi layanan AKAN berfungsi://OK angular.module('myModule').provider('myProvider', function() { // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase) ... this.$get = function($http) { // code to initialize/configure the SERVICE goes here (executed during `run` stage) return myService; }; });
Karena kita sekarang memasukkan layanan ke dalam fungsi inisialisasi layanan, yang dijalankan selama
run
fase, kode ini akan berfungsi.sumber
<script>var config = <% = mySettings.toJson() %>;</script>
.). Ini dapat dilakukan dengan menggunakan mesin templating seperti Smarty untuk PHP, Jinja2 untuk Python, Nunchucks untuk NodeJS, dll.Ini mungkin memberi Anda sedikit pengaruh:
var initInjector = angular.injector(['ng']); var $http = initInjector.get('$http');
Tapi hati-hati, callback berhasil / error mungkin membuat Anda berada dalam kondisi balapan antara aplikasi dimulai dan respons server.
sumber
angular.injector(['mymodule'])
- tetapi saya tidak yakin apakah Anda dapat menggunakan pendekatan ini untuk$http
layanan tersebut. Saya ingin mengatakan saya punya. Tidak yakin apakah ini membantu atau tidak: - /Ini adalah pertanyaan lama, sepertinya kita memiliki beberapa masalah telur ayam yang terjadi jika kita ingin mengandalkan kapabilitas inti dari perpustakaan.
Alih-alih memecahkan masalah dengan cara yang mendasar, yang saya lakukan adalah jalan pintas. Buat arahan yang membungkus seluruh tubuh. Ex.
<body ng-app="app"> <div mc-body> Hello World </div> </body>
Sekarang
mc-body
perlu diinisialisasi sebelum rendering (sekali), mis.link: function(scope, element, attrs) { Auth.login().then() ... }
Auth
adalah layanan atau penyedia, mis..provider('Auth', function() { ... keep your auth configurations return { $get: function($http) { return { login: function() { ... do something about the http } } } } })
Tampak bagi saya bahwa saya memiliki kendali atas urutan bootstrap, itu setelah bootstrap biasa menyelesaikan semua konfigurasi penyedia dan kemudian mencoba untuk menginisialisasi
mc-body
direktif.Dan arahan ini menurut saya bisa di depan routing, karena routing juga disuntikkan melalui ex direktif.
<ui-route />
. Tapi saya bisa salah dalam hal ini. Perlu investigasi lebih lanjut.sumber
Menanggapi pertanyaan Anda, "Ada Ide?", Saya akan menjawab dengan "ya". Tapi tunggu, masih ada lagi!
Saya sarankan hanya menggunakan JQuery di konfigurasi. Sebagai contoh:
var app = angular.module('myApp', ['services']); app.config(['$anyProvider', function ($anyProvider) { $.ajax({ url: 'www.something.com/api/lolol', success: function (result) { $anyProvider.doSomething(result); } }); }]);
sumber