将自定义参数传递给$ resource和transformResponse

时间:2014-04-18 12:17:43

标签: javascript angularjs angularjs-resource

由于一些特殊情况,我目前正忙于使用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技能。 : - )

(如果您对我的问题有另一种完全不同的解决方案,请随时分享!这只是我的第一次拍摄。)

1 个答案:

答案 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时才有效。如果您想修复它,请转到基于承诺的方法。