我使用Angular $资源进行REST服务.由于我的get响应的奇怪,我不能使用$资源服务的CRUD应用程序.
创建一个新的对象的工作(对于卡),相似:
var newCard = new CreditCard(); newCard.name = "Mike Smith"; newCard.$save();
获取作品:
var card = CreditCard().get({_id:1)
但是,GET响应不是对象卡本身,而是带有其他消息(包装对象)
{ message: ".....",response: Card //object }
所以当我保存通过资源检索的实例时,它会发送包装对象(与响应字段中修改的Card对象).
这可能是正确的,但我的服务器期望卡对象不是包装.
有没有办法定制$资源,以便它发送所需的对象.从doc,看起来只能url参数可以改变.
$resource(url[,paramDefaults][,actions]);
解决方法
我还在$资源模块中的标准实现中遇到问题.有一段时间,我刚刚在我自己的$资源文件的本地拷贝中进行编辑,但是我发现我仍然不满意他们实现REST资源的方式.我需要比提供的更多的灵活性.
标准的$resource模块只是围绕$http的工厂包装.如果您在$资源模块中清除代码,则可以很容易地创建自己的自定义实现.
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工厂,就像$资源一样.
app.controller('CreditCardCtrl',function($scope,CreditCard) { $scope.creditCard = CreditCard().get(3); });
这样您可以解析您所需的REST操作的响应,并允许您实现所需的任何操作.例如:我希望在我的资源上使用一个保存方法,以便在选择使用POST之前检查该对象是否具有一个id属性(如果没有id可用,则创建一个新的资源)或一个PUT(当一个PUT有效的ID可用).
这也将允许您实现一种不同的处理方式07.1. angular.js方式内置于$http中,但是我公司的REST API通过将JSON数组包含在一个虚拟对象中来解决这个问题.我使用像上面那样的自定义资源来解析虚拟对象.