我在 $resource 模块中的标准实现方面也遇到了问题。有一段时间,我只是在自己的 $resource 文件的本地副本中进行了编辑,但我发现我仍然对他们实现 REST 资源的方式不满意。我需要比所提供的更多的灵活性。
标准$资源 https://github.com/angular/angular.js/blob/master/src/ngResource/resource.jsmodule 只是 $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;
}]);
然后,在您的控制器函数中,注入 CreditCard 工厂,就像注入 $resource 一样。
app.controller('CreditCardCtrl', function($scope, CreditCard) {
$scope.creditCard = CreditCard().get(3);
});
这允许您以任何您想要的方式解析 REST 操作的响应,并且还允许您实现您想要的任何操作。例如:我想要在我的资源上有一个 save 方法,该方法会在选择使用 POST(当没有 id 可用时创建新资源)或 PUT(当 ID 不可用时更新现有资源)之前检查对象是否具有 id 属性。有效的 ID 可用)。
这也将允许您实施一种不同的方式来处理JSON CSRF 漏洞 http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx。 angular.js 方式内置于 $http 中,但我公司的 REST API 通过将 JSON 数组包装在虚拟对象中来解决此问题。我使用像上面这样的自定义资源来解析虚拟对象。