Skonfiguruj usługę jako niestandardowego dostawcę AngularJS
Pomimo tego, co mówi Zaakceptowana odpowiedź, w rzeczywistości MOŻESZ zrobić to, co zamierzałeś zrobić, ale musisz ustawić go jako konfigurowalnego dostawcę, aby był dostępny jako usługa na etapie konfiguracji. Najpierw zmień Service
dostawcę na dostawcę jak pokazano niżej. Kluczowa różnica polega na tym, że po ustawieniu wartości defer
ustawia się defer.promise
właściwość na obiekt obietnicy zwracany przez $http.get
:
Usługa dostawcy: (dostawca: przepis na usługę)
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;
})
}
}
Teraz masz konfigurowalnego dostawcę niestandardowego, wystarczy go wstrzyknąć. Kluczowa różnica polega na tym, że brakujący „Dostawca na Twoim wstrzykiwaczu”.
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();
}
}
})
});
użyj rozwiązanych danych w swoim 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);
}
})
Możliwe alternatywy
Poniższa alternatywa jest podobnym podejściem, ale umożliwia definicję w ramach .config
, hermetyzowanie usługi do określonego modułu w kontekście aplikacji. Wybierz odpowiednią dla siebie metodę. Zobacz także poniżej uwagi na temat trzeciej alternatywy i pomocnych linków, które pomogą Ci zrozumieć te wszystkie rzeczy
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:
}
})
});
Kilka pomocnych zasobów
- John Lindquist ma doskonałe 5-minutowe wyjaśnienie i demonstrację tego na egghead.io i jest to jedna z bezpłatnych lekcji! Zasadniczo zmodyfikowałem jego demonstrację, czyniąc ją
$http
konkretną w kontekście tej prośby
- Zobacz przewodnik dla programistów AngularJS na temat dostawców
- Na clevertech.biz znajduje się również doskonałe wyjaśnienie dotyczące
factory
/ service
/ .provider
Dostawca zapewnia nieco większą konfigurację w stosunku do .service
metody, co czyni go lepszym jako dostawca na poziomie aplikacji, ale możesz również hermetyzować to w samym obiekcie konfiguracyjnym, wstrzykując $provide
do konfiguracji w następujący sposób: