Налаштуйте свою послугу як користувальницький постачальник послуг 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інкапсуляції послуги в межах конкретного модуля в контексті вашої програми. Виберіть метод, який підходить саме вам. Також дивіться нижче примітки до третьої альтернативи та корисних посилань, які допоможуть вам розвісити всі ці речі
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-хвилинне пояснення та демонстрацію цього на egghead.io , і це один із безкоштовних уроків! Я в основному змінив його демонстрацію, зробивши її
$httpконкретною в контексті цього запиту
- Перегляньте посібник розробника AngularJS про провайдерів
- Також є чудове пояснення щодо
factory/ service/ provider на clevertech.biz .
Постачальник надає вам трохи більше конфігурації за допомогою .serviceметоду, що робить його кращим як постачальник рівнів додатків, але ви також можете інкапсулювати це всередині самого конфігураційного об'єкта, ввівши $provideв конфігурацію так: