Thiết lập dịch vụ của bạn như một Nhà cung cấp AngularJS tùy chỉnh
Mặc dù câu trả lời được chấp nhận nói, bạn thực sự CÓ THỂ làm những gì bạn định làm, nhưng bạn cần thiết lập nó như một nhà cung cấp có thể định cấu hình, để nó có sẵn như một dịch vụ trong giai đoạn cấu hình .. Trước tiên, hãy đổi bạn Service
thành nhà cung cấp như hình dưới đây Sự khác biệt chính ở đây là sau khi đặt giá trị của defer
, bạn đặt thuộc defer.promise
tính thành đối tượng lời hứa được trả về bởi $http.get
:
Nhà cung cấp dịch vụ: (nhà cung cấp: công thức dịch vụ)
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;
})
}
}
Bây giờ, bạn có một Nhà cung cấp tùy chỉnh cấu hình, bạn chỉ cần tiêm nó. Sự khác biệt chính ở đây là "Nhà cung cấp trên tiêm" của bạn bị thiếu.
cấu hình:
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();
}
}
})
});
sử dụng dữ liệu được giải quyết trong 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);
}
})
Các lựa chọn thay thế có thể
Cách thay thế sau đây là một cách tiếp cận tương tự, nhưng cho phép định nghĩa xảy ra trong .config
, đóng gói dịch vụ vào trong mô-đun cụ thể trong ngữ cảnh của ứng dụng của bạn. Chọn phương pháp phù hợp với bạn. Ngoài ra hãy xem bên dưới để biết các ghi chú về một liên kết thay thế và hữu ích thứ 3 để giúp bạn hiểu rõ tất cả những điều này
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:
}
})
});
Một vài tài nguyên hữu ích
- John Lindquist có một lời giải thích và trình diễn xuất sắc trong 5 phút về điều này tại egghead.io , và đó là một trong những bài học miễn phí! Về cơ bản tôi đã sửa đổi phần trình diễn của anh ấy bằng cách làm cho nó
$http
cụ thể trong bối cảnh yêu cầu này
- Xem hướng dẫn dành cho nhà phát triển AngularJS trên Nhà cung cấp
- Ngoài ra còn có một lời giải thích tuyệt vời về
factory
/ service
/ provider
tại clevertech.biz .
Nhà cung cấp cung cấp cho bạn cấu hình nhiều hơn một chút so với .service
phương thức, điều này làm cho nó tốt hơn với tư cách là nhà cung cấp mức ứng dụng, nhưng bạn cũng có thể gói gọn điều này trong chính đối tượng cấu hình bằng cách đưa $provide
vào cấu hình như vậy: