Javascript 将自定义参数传递给$resource和transformResponse
由于一些特殊情况,我目前正忙于使用AngularJS创建一个只支持客户端、无服务器的应用程序。它的唯一用途(目前)是读取一个.json文件,其中包含一个Activity对象数组,如下所示:Javascript 将自定义参数传递给$resource和transformResponse,javascript,angularjs,angularjs-resource,Javascript,Angularjs,Angularjs Resource,由于一些特殊情况,我目前正忙于使用AngularJS创建一个只支持客户端、无服务器的应用程序。它的唯一用途(目前)是读取一个.json文件,其中包含一个Activity对象数组,如下所示: [{ "id": "sta", "title": "IT Strategy & Governance", "type": "management", "order": 1 }, { "id": "por", "title": "Portfolio Man
[{
"id": "sta",
"title": "IT Strategy & Governance",
"type": "management",
"order": 1
},
{
"id": "por",
"title": "Portfolio Management",
"type": "management",
"order": 2
},
{
"id": "org",
"title": "Organization & Process Management",
"type": "management",
"order": 3
}]
请记住,此文件是静态的,不是由任何类型的后端生成的。我现在要实现目标
目标1是加载此完整的对象列表。我使用Angular$资源完成这项工作,如下所示,它工作得非常出色:
服务:
pexServices.factory('Activities', function($resource) {
return $resource('data/activities.json', {});
});
控制器:
pexControllers.controller('ActivityCtrl',
function($scope, Activities) {
$scope.activities = Activities.query();
}
);
目标2是从该数组中获取一条单独的记录,通过其ID进行选择。与以前一样,数据应从一个大数据文件中提取,包括所有数据对象
我的想法是向上面介绍的$resource添加一个自定义get函数,并包含一些提取请求元素的transformResponse代码:
pexServices.factory('Activities', function($resource) {
return $resource('data/activities.json', {}, {
get: {
method: "GET",
transformResponse: function(rawData, headersGetter) {
var jsonData = jQuery.parseJSON(rawData);
var requestedObject = jsonData.filter(function(activity) {
return activity.id == "THEREQUESTEDID";
});
return requestedObject.shift();
}
}
});
});
这非常有效,但前提是我在请求时硬编码了请求的ID。但是,我显然希望将一个变量参数传递到get函数中,以便提取所需的对象,如下所示:
$scope.activity = Activities.get({activityId: "sta"});
不幸的是,这正是我被困的地方。如何使参数从控制器一直传递到transformResponse函数,在那里我可以使用它过滤阵列
如前所述,文件本身是静态的,不会对任何参数做出反应,因此我需要在客户端上手动进行过滤
非常感谢您的支持,感谢您牢记我有限的JS技能。:-)
(如果你对我的问题有另一个完全不同的解决方案,也请随意分享!这只是我的第一次尝试。)不是这样!您需要创建一个带有方法的服务,并将资源对象包装在其中。服务应该是这样的
pexServices.factory('Activities', function ($resource) {
var service = {};
var cachedActivities = [];
service.getAll = function () {
cachedActivities = $resource('data/activities.json', {});
return cacheActivities;
}
service.getActivity = function (id) {
var requestedObject = jsonData.filter(function (activity) {
return cachedActivities.id == id;
});
return requestedObject.shift();
}
return service;
});
现在,您的服务有两种方法,一种用于列表,另一种用于特定活动。此外,从服务器检索到的活动也缓存在局部变量中。这里唯一的问题是,
getActivity
只有在您首先调用getAll
时才会起作用。如果您想解决此问题,请采用基于承诺的方法。非常感谢您的意见。我的JS技能进一步提高后,我会再仔细考虑一下!