gpt4 book ai didi

javascript - Angularjs - 自定义 $resource

转载 作者:可可西里 更新时间:2023-11-01 02:56:42 25 4
gpt4 key购买 nike

我将 Angular $resource 用于 REST 服务。由于 get 响应中的问题,我无法将 $resource 服务用于 CRUD 应用程序。

创建一个新的对象工作(比如卡片),类似于:

var newCard = new CreditCard();
newCard.name = "Mike Smith";
newCard.$save();

获取也有效:

var card = CreditCard().get({_id:1)

但是,GET 响应不是对象 Card 本身,而是其他消息(包装对象)

{ message: ".....",
response: Card //object
}

所以当我保存通过资源检索的实例时,它会发送包装器对象(在响应字段中使用修改后的 Card 对象)。这可能是正确的,但我的服务器期望 Card 对象而不是包装器。有没有办法自定义 $resource 以便它发送所需的对象。从文档来看,似乎只能更改 url 参数。

$resource(url[, paramDefaults][, actions]);

最佳答案

我在 $resource 模块中的标准实现也遇到了问题。有一段时间我只是在我自己的 $resource 文件的本地副本中进行编辑,但我发现我仍然对他们实现 REST 资源的方式不满意。我需要比所提供的更多的灵 active 。

标准$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;

}]);

然后,在您的 Controller 函数中,像注入(inject) $resource 一样注入(inject) CreditCard 工厂。

app.controller('CreditCardCtrl', function($scope, CreditCard) {
$scope.creditCard = CreditCard().get(3);
});

这使您可以随心所欲地解析 REST 操作的响应,还可以实现您想要的任何操作。例如:我想在我的资源上使用一个 save 方法,在选择使用 POST(当没有 id 可用时创建新资源)或 PUT(当有效 ID 可用)。

这还允许您实现处理 JSON CSRF Vulnerability 的不同方式。 . $http 内置了 angular.js 方法,但我公司的 REST API 通过将 JSON 数组包装在一个虚拟对象中来解决这个问题。我使用像上面那样的自定义资源来解析虚拟对象。

关于javascript - Angularjs - 自定义 $resource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12719782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com