如何从angular.js资源中获取数字数组?

时间:2013-04-30 05:18:40

标签: javascript angularjs

我的RESTful API返回一个数组:

GET /test => [1367297123312,1.0,2.0,3.0,100]

我有服务:

(angular
 .module('app.services', ['ng', 'ngResource'])
 .factory('myData', [
     /******/ '$resource',
     function ($resource) {
         return $resource('test');
     }])
);

在我的控制器中,我需要获取数字。我试过了:

(angular
 .module('app.controllers', ['ng', 'app.services'])
 .controller('tweetsapiContr', [
     /******/ '$scope', 'myData',
     function ($scope,   myData) {
         myData.get({}, function (data) {
             console.log(data);
         };
     }
 ])
);

上面给出了TypeError: Object #<h> has no method 'push'错误,如果我在服务上使用query而不是get,它会返回一个包含$get等方法的对象数组, $save等,但调用$get例如返回undefined

如何获取数字?使用来自服务器的哈希响应有效,但我试图弄清楚如何使它适用于数组。

4 个答案:

答案 0 :(得分:8)

  

资源“类”对象,其具有用于默认资源动作集的方法,可选地>使用自定义actions进行扩展。默认设置包含以下操作:

{ 'get':    {method:'GET'},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} };

所以你有两个选择:

在资源对象上设置自定义方法:

$resource("/url/:someParam", {}, {
    getMyArray: {method:"GET", params: {someParam:"hello"}, isArray: true}
});

使用查询方法

资源对象有一个query方法,使用isArray: true定义,如您在答案顶部所示。

请注意,使用顶级数组响应GET方法存在安全漏洞,因为可以重新定义数组构造函数。

阅读那些: JSON security best practices? What are "top level JSON arrays" and why are they a security risk?

答案 1 :(得分:7)

This open issue (#4314)提供了很好的信息,说明$resource无法解析数字(以及其他原始数据类型如字符串)的原因。

根据我的理解,$ resource需要处理对象,以便它可以附加它的方法(getquerypost等...)。如果您要做的只是阅读数组并且永远不需要“更新”它,他们建议您直接使用$http

希望有助于清理问题,并将此问题的未来读者指向正确的方向,以便通过REST api处理数组的最佳实践。

答案 2 :(得分:5)

您可以使用isArray:true向资源添加自定义操作; (resource docs

return $resource('test', {}, {
  getArray: { method: 'GET', isArray: true } 
};

然后我相信你必须用美元符号myData.$getArray

来称呼它

答案 3 :(得分:2)

您不应该返回JSON数组,因为它们容易受到跨站点攻击。阅读本文了解为什么部分http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx

返回附加到属性的数组的对象。这将减轻潜在的攻击并一次解决您的问题。

{
    d: [1,2,3,4,5]
}


myData.get({}, function (data) {
    console.log(data.d);
};

还想要阵列吗?

您可以重新构建资源的操作,并将操作的isArray属性设置为true

Angular ngResource docs

var actions = { 
  'get':    {method:'GET', isArray:true},
  'save':   {method:'POST'},
  'query':  {method:'GET', isArray:true},
  'remove': {method:'DELETE'},
  'delete': {method:'DELETE'} 
};

$resource(url[, paramDefaults][, actions]);