由于一些特殊情况,我目前正忙于使用AngularJS创建一个仅限客户端,无服务器的应用程序。它的唯一目的(暂时)是读取.json文件,其中包含 Activity 对象的数组,如下所示:
[{
"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();
}
}
});
});
这很有效,但只要我在 THEREQUESTEDID 处对所请求的ID进行硬编码。但是,我显然想将一个变量参数传递给get函数,以便拉出所需的对象,如下所示:
$scope.activity = Activities.get({activityId: "sta"});
不幸的是,这就是我被困一段时间了。如何启用参数从我的控制器一直传递到 transformResponse 函数,我可以用它来过滤数组?
如前所述,文件本身是静态的,不会对任何参数做出反应,因此我需要在客户端上手动进行过滤。
非常感谢您的支持,并牢记我有限的JS技能。 : - )
(如果您对我的问题有另一种完全不同的解决方案,请随时分享!这只是我的第一次拍摄。)
答案 0 :(得分:0)
不是这样!您需要使用方法创建服务并将资源对象包装在其中。服务将是这样的
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
时才有效。如果您想修复它,请转到基于承诺的方法。