Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/445.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将自定义参数传递给$resource和transformResponse_Javascript_Angularjs_Angularjs Resource - Fatal编程技术网

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

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

由于一些特殊情况,我目前正忙于使用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();
        }
    }
    });
});
这非常有效,但前提是我在请求时硬编码了请求的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技能进一步提高后,我会再仔细考虑一下!