एक कस्टम AngularJS प्रदाता के रूप में अपनी सेवा सेट करें
स्वीकृत जवाब के बावजूद, आप वास्तव में वही कर सकते हैं जो आप करने का इरादा कर रहे थे, लेकिन आपको इसे एक कॉन्फ़िगर करने योग्य प्रदाता के रूप में स्थापित करने की आवश्यकता है, ताकि यह कॉन्फ़िगरेशन चरण के दौरान एक सेवा के रूप में उपलब्ध हो .. सबसे पहले, Service
एक प्रदाता को बदलें जैसा की नीचे दिखाया गया। यहां मुख्य अंतर यह है कि मूल्य निर्धारित करने के बाद defer
, आपने defer.promise
संपत्ति को वादे के आधार पर वापस कर दिया$http.get
:
प्रदाता सेवा: (प्रदाता: सेवा नुस्खा)
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;
})
}
}
अब, आपके पास एक विन्यास योग्य प्रदाता है, आपको बस इसे इंजेक्ट करने की आवश्यकता है। यहां महत्वपूर्ण अंतर गायब "प्रदाता आपके इंजेक्टेबल पर" है।
config:
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();
}
}
})
});
अपने में हल किए गए डेटा का उपयोग करें 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);
}
})
संभव विकल्प
निम्नलिखित विकल्प एक समान दृष्टिकोण है, लेकिन परिभाषा को .config
आपके ऐप के संदर्भ में विशिष्ट मॉड्यूल के भीतर सेवा को इनकैप्सुलेट करने की अनुमति देता है । आपके लिए सही तरीका चुनें। इन सभी चीज़ों को लटका पाने में आपकी सहायता के लिए 3 वैकल्पिक और उपयोगी लिंक पर नोट्स के लिए नीचे देखें
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:
}
})
});
कुछ सहायक संसाधन
- जॉन लिंडक्विस्ट का एक उत्कृष्ट 5 मिनट का स्पष्टीकरण और एग्जहेड.आईओ पर इसका प्रदर्शन है , और यह मुफ्त पाठों में से एक है! मैंने मूल रूप से उसके प्रदर्शन को संशोधित करके बनाया है
$http
अनुरोध को इस अनुरोध के संदर्भ में विशिष्ट
- पर AngularJS डेवलपर गाइड देखें प्रदाता
- चालाक / के बारे में
factory
/ service
/ provider
पर एक उत्कृष्ट व्याख्या भी है ।
प्रदाता आपको .service
विधि के बारे में थोड़ा और विन्यास देता है , जो इसे एक एप्लिकेशन स्तर प्रदाता के रूप में बेहतर बनाता है, लेकिन आप इसे कॉन्फ़िगर करने के लिए कॉन्फ़िगर ऑब्जेक्ट के भीतर इसे भी एन्क्रिप्ट कर सकते हैं $provide
जैसे: