【问题标题】:how to get an array of numbers from angular.js resource?如何从 angular.js 资源中获取数字数组?
【发布时间】:2013-04-23 22:42:23
【问题描述】:

我的 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等方法,但调用@例如 987654329@ 返回 undefined

如何获得数字?响应来自服务器的哈希是可行的,但我正在尝试弄清楚如何使其与数组一起使用。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    This open issue (#4314) 有很好的信息说明为什么数字(和其他原始数据类型,如字符串)不能被 $resource 解析。

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

    希望这有助于理清问题,并为该问题的未来读者指明正确的方向,以获得通过 REST api 处理数组的最佳实践。

    【讨论】:

      【解决方案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]);
      

      【讨论】:

      • 是的,我以前看过这篇文章。我仍然有兴趣弄清楚如何获取数组。我认为这不是数组的问题,而是数字的问题。
      • 我也觉得处理数字有问题
      【解决方案3】:

      一个资源“类”对象,带有用于默认资源操作集的可选方法 > 使用自定义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}
      });
      

      使用查询方式

      Resource 对象有一个query 方法,该方法是用isArray: true 定义的,您可以在答案顶部看到。

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

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

      【讨论】:

        【解决方案4】:

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

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

        那我相信你必须用美元符号来称呼它myData.$getArray

        【讨论】:

        • 我认为您没有正确使用它,当您调用资源获取对象时,应该评估您的数据。试试var myArray = myData.query(); console.log(myArray)
        • 这不起作用,因为资源返回一个承诺对象,该对象稍后在响应返回时填充。
        猜你喜欢
        • 2011-02-19
        • 2023-03-20
        • 2011-08-13
        • 1970-01-01
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多