我需要使用两个REST API:一个来自Mongolab用于开发目的,另一个来自实际API,目前无法访问。问题是ID在这些中的处理方式略有不同,并且对象结构不同。 Mongo使用object._id.$oid
表示法和实际的API object.ID
表示法。 Mongolab资源是:
app.factory('Items', function ($resource) {
var items = $resource('https://api.mongolab.com/api/1/databases/x/collections/items/:id',
{
apiKey:'x',
id:'@_id.$oid'
}
});
return items;
});
查询调用(当前正在使用):
$scope.items = Items.query({}, function () {
if (API == 'Mongo') {
angular.forEach($scope.items, function(item) {
item.ID = item._id.$oid;
});
};
});
我希望能够在不修改每个查询调用或链接中的代码的情况下轻松切换不同的API(我有数十个调用和带有资源ID的链接)。所以我想将API == 'Mongo'
检查移到上一级:我尝试在我创建forEach
资源的工厂中直接使用Items
ID更改,但它不能以这种方式工作。如何在通过query
填充结果之前直接修改结果?
或者我应该为不同的API创建不同的分支?
答案 0 :(得分:2)
我认为您可以添加两个不同的工厂,并根据“API”变量的值查询您需要的工厂。
app.factory('ItemsApi', function ($resource) {
var items = $resource('https://api.mongolab.com/api/1/databases/x/collections/items/:id',
{
apiKOey:'x',
id:'@_id.$oid'
}
});
return items;
});
app.factory('ItemsMongo', function ($resource) {
var items = $resource('https://api.mongolab.com/api/1/databases/x/collections/items/:id',
{
apiKey:'x',
id:'@id'
}
});
return items;
});
然后在控制器中(而不是在资源工厂中),您可以使用:
if (API == 'Mongo')
$scope.items = ItemsApi.query();
else
$scope.items = ItemsMongo.query();
<强>更新强>
如果这是您目前拥有的,那么您可能需要考虑为返回的数组中的每个元素添加一个附加属性。您可以通过覆盖默认的工厂query()方法,然后迭代每个元素添加重复的ID字段来完成此操作。看看这个:
$resource('https://../:id',{id: '@id'}, {
query: {
isArray: true,
method: 'GET',
params: {},
transformResponse: function (data) {
var wrapped = angular.fromJson(data);
angular.forEach(wrapped, function(item) {
--do something to wrapped items --
});
return wrapped;
}
}
transformResponse 和 angular.forEach 应该做的伎俩