我在$resource模块的标准实现中也遇到了问题。一度我只是在自己本地的$resource文件中进行修改,但我发现他们实现REST资源的方式仍然无法满足我的需求。我需要更多的灵活性。
标准的$resource模块只是对$http的工厂包装器。如果你将$resource模块的代码简化,你可以相当容易地创建自己的自定义实现。
var app = angular.module('app', []);
app.factory('CreditCard', ['$http', function($http) {
function CreditCardFactory() {
function parseMessage(message) {
if (message.response) {
return message.response;
}
}
function CreditCard(value) {
angular.copy(value || {}, this);
}
CreditCard.$get = function(id) {
var value = this instanceof CreditCard ? this : new CreditCard();
$http({
method: 'GET',
url: '/creditcards/' + id
}).then(function(response) {
var data = response.data;
if (data) {
angular.copy(parseMessage(data), value);
}
});
return value;
};
CreditCard.prototype.$get = function(id) {
CreditCard.$get.call(this, id);
};
return CreditCard;
}
return CreditCardFactory;
}]);
然后,在您的控制器函数中,像使用 $resource 一样注入 CreditCard 工厂。
app.controller('CreditCardCtrl', function($scope, CreditCard) {
$scope.creditCard = CreditCard().get(3);
});
这允许您以任何想要的方式解析您的REST操作的响应,并且还允许您实现任何想要的操作。例如:我想在我的资源上拥有一个保存方法,该方法将检查对象是否具有ID属性,然后选择使用POST(在没有可用ID时创建新资源)或PUT(在存在有效ID时更新现有资源)。
这也允许您实现处理JSON CSRF漏洞的不同方式。Angular.js方式已经内置于$http中,但是我们公司的REST API通过在虚拟对象中包装JSON数组来解决此问题。我使用类似上面的自定义资源来解析虚拟对象。