gpt4 book ai didi

AngularJS 和 django tastypie 返回的复杂 JSON

转载 作者:行者123 更新时间:2023-12-02 19:19:45 25 4
gpt4 key购买 nike

我在 AngularJS 上编写的访问 Tastypie API 的资源很少。一切正常,除了一个细节:tastypie 总是将实际结果封装在 JSON 的 objects 属性中,例如:

/api/v1/reminder/:

{
meta: {
limit: 20,
next: null,
offset: 0,
previous: null,
total_count: 3
},
objects: [{
category: {
color: "#999999",
id: 1,
name: "Groceries",
resource_uri: "/api/v1/category/1"
},
description: "",
due_date: "2010-10-16",
id: 1,
repeat: "weekly",
resource_uri: "/api/v1/reminder/1",
value: "-50"
}, {
category: {
color: "#999999",
id: 1,
name: "Groceries",
resource_uri: "/api/v1/category/1"
},
description: "",
due_date: "2010-10-17",
id: 2,
repeat: "weekly",
resource_uri: "/api/v1/reminder/2",
value: "-50"
}
}

使用 get() 调用的回调来修复是很浪费的:

Reminder.get().$then(function (result) {
$scope.reminders = result.data.objects;
});

但我知道 result.resource 是一个实际的 Reminder 实例。

.factory('Reminder', ['$resource', function($resource){
var Reminder = $resource('/api/v1/reminder/:id', {}, {
get: {
method: 'GET',
isArray: false
}
});

Reminder.prototype.TESTE = function () {console.log('asd');};

return Reminder;
}])

现在我需要在 Reminder 类上实现行为,并且我需要 meta.objects 上的每个元素都是 Reminder 的实例>:

Reminder.get().$then(function (result) {
$scope.reminders = result.data.objects;

result.resource.TESTE(); // -> outputs 'asd'

o = result.data.objects[0];
o.TESTE // -> undefined, obvisously
i = new Reminder(o);
i.TESTE() // -> outputs 'asd'
});

那么,如何让 AngularJS 理解 objects 上的每个对象都是实际结果,因此它的行为就像一个实例列表?

解决方法是创建一个新列表,迭代创建实例的结果,但这不是最佳选择......

建议?

@rtcherry 的解决方案:

根据rtcherry的建议,我使用了restangular

配置请求数据的读取:

.config(['RestangularProvider', function(RestangularProvider) {
RestangularProvider.setBaseUrl("/api/v1");

RestangularProvider.setResponseExtractor(function(response, operation, what, url) {
var newResponse;
if (operation === "getList") {
newResponse = response.objects;
newResponse.metadata = response.meta;
} else {
newResponse = response.data;
}
return newResponse;
});
}])

加载提醒:

function RemindersCtrl ($scope, $rootScope, Reminder) {
$scope.reminders = Reminder.getList();
}

将我的自定义方法添加到Reminder(不像ngResource那么干净,但可行):

.factory('Reminder', ['Restangular', '$filter', function(Restangular, $filter){
var Reminder = Restangular.all('reminder');

var remainingDays = function () {
//do stuff
};

// adding custom behavior
Restangular.addElementTransformer('reminder', false, function (reminder) {
reminder.remainingDays = remainingDays;
return reminder;
});

return Reminder;
}])

@modern Degree 的解决方案:

我使用纯ngResource:

var tastypieDataTransformer = function ($http) {
return $http.defaults.transformResponse.concat([
function (data, headersGetter) {
var result = data.objects;
result.meta = data.meta;
return result;
}
])
};

...

.factory('Reminder', ['$resource', '$http', function($resource, $http){
var Reminder = $resource('/api/v1/reminder/:id', {}, {
query: {
method: 'GET',
isArray: true,
transformResponse: tastypieDataTransformer($http)
}
});

Reminder.prototype.remainingDays = function () {
// doing stuff
};

return Reminder;
}])

我的 Controller :

Transaction.query(filter).$then(function (result) {
$scope.days = [];
var transactions = result.resource;
resource[0].remainingDays(); // it works

});

最佳答案

如果您想避免使用额外的库,您应该能够执行以下操作:

$resource('/api/v1/reminder/', {}, {
query: {
method: 'GET',
isArray: true,
transformResponse: $http.defaults.transformResponse.concat([
function (data, headersGetter) {
return data.objects;
}
])
}
});

这会将您的转换附加到 $HttpProvider 的默认转换器。

注意:如果我在这方面有误,请纠正我,但我相信此功能需要 v1.1.2 或更高版本。

关于AngularJS 和 django tastypie 返回的复杂 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17309955/

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