使用 ngResource 封装 RESTFul API
我们通常不使用 Controller 直接调用 HTTP 请求,而是把这些请求通过 Service 封装后使用。这么做的好处是:
- 可以在多个地方重复使用
- 分离关注点,Controller 放置用户交互的逻辑,Service 放置与界面无关的逻辑
基本的做法是:
angular.module('app').service('Message', MessageService);
// @ngInject
function MessageService($http, $q) {
this.getAll = function () {
var deferred = $q.defer();
$http.get('/api/messages')
.success(deferred.resolve)
.error(deferred.reject);
return deferred.promise;
};
this.getById = function (id) {
var deferred = $q.defer();
$http.get('/api/messages/' + id)
.success(deferred.resolve)
.error(deferred.reject);
return deferred.promise;
};
}
使用方法是:
angular.module('app').controller('PageController', PageController);
// @ngInject
function PageController(Message) {
var vm = this;
load();
function load() {
Message.getAll().then(function (messages) {
vm.messages = messages;
});
}
}
这么做每次都要写大量增删改查的代码,很麻烦。更好的做法是使用 ngResource 代替自己写的 Service,好处是:
- 基本增删改查自动生成,无需编写额外的代码
- 自动解决 Promise,更直观
使用之前先将 ngResource 安装好,并加入依赖:
bower install --save angular-resource
Service 编写方法为:
angular.module('app').factory('Message', MessageFactory);
// @ngInject
function MessageFactory($resource) {
return $resource('/api/messages', {}, {});
}
使用方法为:
angular.module('app').controller('PageController', PageController);
// @ngInject
function PageController(Message) {
var vm = this;
load();
function load() {
vm.messages = Message.query();
}
}
更详细的写法请参考官方文档:angular-resource