Hizmetinizi özel bir AngularJS Sağlayıcısı olarak ayarlama
Kabul edilen cevabın söylediklerine rağmen, aslında ne yapmak istediğinizi YAPABİLİRSİNİZ , ancak yapılandırma aşamasında servis olarak kullanılabilmesi için yapılandırılabilir bir sağlayıcı olarak ayarlamanız gerekir. İlk olarak, Service
bir sağlayıcıya değiştirin Aşağıda gösterildiği gibi. Buradaki en önemli fark, değerini defer
ayarladıktan sonra, defer.promise
özelliği döndürülen söz verilen nesneye ayarlamanızdır $http.get
:
Hizmet Sağlayıcı Hizmeti: (sağlayıcı: hizmet tarifi)
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;
})
}
}
Şimdi, yapılandırılabilir bir özel Sağlayıcınız var, sadece enjekte etmeniz gerekiyor. Burada önemli fark eksik "enjekte edilebilir üzerinde Sağlayıcı" olmasıdır.
yapılandırma:
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();
}
}
})
});
çözümlenmiş verileri kullanın 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);
}
})
Olası Alternatifler
Aşağıdaki alternatif benzer bir yaklaşımdır, ancak .config
hizmetin uygulamanız bağlamında belirli bir modül içinde kapsüllenerek tanımın gerçekleşmesine izin verir . Size en uygun yöntemi seçin. Ayrıca, tüm bu şeyleri askıya almanıza yardımcı olacak 3. alternatif ve yararlı bağlantılar hakkında notlar için aşağıya bakın.
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:
}
})
});
Birkaç yardımcı Kaynak
- John Lindquist'in 5 dakikalık mükemmel bir açıklaması ve gösterimi var. egghead.io'da bunun sahiptir ve ücretsiz derslerden biridir! Temelde
$http
bu istek bağlamında gösterisini değiştirerek gösterisini değiştirdim
- Sağlayıcılar hakkındaki AngularJS Geliştirici kılavuzunu görüntüleyin
- Clevertech.biz hakkında
factory
/ service
/ hakkında da mükemmel bir açıklama var provider
. .
Sağlayıcı, .service
yöntem üzerinde biraz daha fazla yapılandırma sağlar , bu da bir uygulama düzeyi sağlayıcısı olarak daha iyi olmasını sağlar, ancak aşağıdaki $provide
gibi yapılandırma enjekte ederek bunu yapılandırma nesnesinin içinde kapsülleyebilirsiniz :