Siapkan layanan Anda sebagai Penyedia AngularJS khusus
Terlepas dari apa yang dikatakan jawaban yang Diterima, Anda sebenarnya BISA melakukan apa yang ingin Anda lakukan, tetapi Anda perlu mengaturnya sebagai penyedia yang dapat dikonfigurasi, sehingga tersedia sebagai layanan selama fase konfigurasi .. Pertama, ubah Anda Service
ke penyedia seperti yang ditunjukkan di bawah ini. Perbedaan utama di sini adalah setelah menetapkan nilai defer
, Anda menyetel defer.promise
properti ke objek janji yang dikembalikan oleh $http.get
:
Layanan Penyedia: (penyedia: resep layanan)
app.provider('dbService', function dbServiceProvider() {
//the provider recipe for services require you specify a $get function
this.$get= ['dbhost',function dbServiceFactory(dbhost){
// return the factory as a provider
// that is available during the configuration phase
return new DbService(dbhost);
}]
});
function DbService(dbhost){
var status;
this.setUrl = function(url){
dbhost = url;
}
this.getData = function($http) {
return $http.get(dbhost+'db.php/score/getData')
.success(function(data){
// handle any special stuff here, I would suggest the following:
status = 'ok';
status.data = data;
})
.error(function(message){
status = 'error';
status.message = message;
})
.then(function(){
// now we return an object with data or information about error
// for special handling inside your application configuration
return status;
})
}
}
Sekarang, Anda memiliki Penyedia kustom yang dapat dikonfigurasi, Anda hanya perlu menyuntikkannya. Perbedaan utama di sini adalah "Penyedia injeksi Anda" yang hilang.
konfigurasi:
app.config(function ($routeProvider) {
$routeProvider
.when('/', {
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
dbData: function(DbService, $http) {
/*
*dbServiceProvider returns a dbService instance to your app whenever
* needed, and this instance is setup internally with a promise,
* so you don't need to worry about $q and all that
*/
return DbService('http://dbhost.com').getData();
}
}
})
});
gunakan data terselesaikan di appCtrl
app.controller('appCtrl',function(dbData, DbService){
$scope.dbData = dbData;
// You can also create and use another instance of the dbService here...
// to do whatever you programmed it to do, by adding functions inside the
// constructor DbService(), the following assumes you added
// a rmUser(userObj) function in the factory
$scope.removeDbUser = function(user){
DbService.rmUser(user);
}
})
Alternatif yang Mungkin
Alternatif berikut adalah pendekatan yang serupa, tetapi memungkinkan definisi terjadi di dalam .config
, merangkum layanan ke dalam modul spesifik dalam konteks aplikasi Anda. Pilih metode yang tepat untuk Anda. Lihat juga di bawah untuk catatan tentang alternatif ke-3 dan tautan bermanfaat untuk membantu Anda memahami semua hal ini
app.config(function($routeProvider, $provide) {
$provide.service('dbService',function(){})
//set up your service inside the module's config.
$routeProvider
.when('/', {
templateUrl: "partials/editor.html",
controller: "AppCtrl",
resolve: {
data:
}
})
});
Beberapa Sumberdaya yang bermanfaat
- John Lindquist memiliki penjelasan dan demonstrasi 5 menit yang sangat baik di egghead.io , dan ini adalah salah satu pelajaran gratis! Saya pada dasarnya memodifikasi demonstrasi dengan membuatnya
$http
spesifik dalam konteks permintaan ini
- Lihat panduan Pengembang AngularJS di Penyedia
- Ada juga penjelasan yang bagus tentang
factory
/ service
/ provider
di clevertech.biz .
Penyedia memberi Anda sedikit lebih banyak konfigurasi atas .service
metode, yang membuatnya lebih baik sebagai penyedia tingkat aplikasi, tetapi Anda juga bisa merangkum ini dalam objek konfigurasi itu sendiri dengan menyuntikkan $provide
ke konfigurasi seperti: