Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.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
Java 使用嵌套数组迭代AngularJS资源_Java_Angularjs_Angularjs Resource - Fatal编程技术网

Java 使用嵌套数组迭代AngularJS资源

Java 使用嵌套数组迭代AngularJS资源,java,angularjs,angularjs-resource,Java,Angularjs,Angularjs Resource,我有一个小的webapp,前端使用AngularJS,后端使用Java。我正在使用REST进行通信 在后端,我创建了一个列表列表,如下所示: List<List<Data>> allData = new ArrayList<>(); allData.add(firstList); allData.add(secondList); [{ item: [1,2,3,4,5] }, { item: [1,2,

我有一个小的webapp,前端使用AngularJS,后端使用Java。我正在使用REST进行通信

在后端,我创建了一个列表列表,如下所示:

        List<List<Data>> allData = new ArrayList<>();
        allData.add(firstList);
        allData.add(secondList);
[{
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}];
List allData=new ArrayList();
allData.add(第一个列表);
allData.add(第二个列表);
当它到达前端时,如下面的屏幕截图所示-即,它不是一个Array[]对象中的2个Array[]对象,而是这些资源对象中的2个,具有Array[]对象的列表。 问题是,我现在想遍历这个数组列表,但我不知道如何从这个资源对象获取列表的长度!我试过长度,尺寸,计数。。。所有这些都是未定义的

问题是我如何让它保持数组在一个数组结构中,这样我就可以轻松地进行迭代?或者如何从资源对象获取长度

TIA(请原谅这个新手问题)

正在扩展一个资源节点:


您能否提供代码处理资源接收?我猜您使用的是
$resource
服务; 如果需要数据(例如用于处理目的),则需要考虑响应的异步性质:访问资源的
$promise
,并提供回调以检索结果。代码可能如下所示:

myResouce.$promise.then(function(result) {
    $scope.data = result;
    console.log('length = ' + $scope.data.length);
}

如果您实际上不需要数据,
$resource
会立即返回一个空对象,稍后将由响应内容填充。您可以只执行var
$scope.data=$resource(…)
并在查看器中使用此数据对象。视图开始时可能为空,但当数据从
$resource
响应实际传递到
$scope.data
时,视图将被更新。

您所经历的行为与以下事实有关:
$resource
查询()
,其中预期的响应数据是一个数组,该数组中的每个数据项都转换为一个资源对象,其中包含附加后缀
$
的实例操作方法

正如您在上面的中所看到的,它执行数组中数据项的副本,使用仅迭代属性的将数据项的所有属性扩展到资源对象本身。由于不是可枚举属性,因此不会从数组数据项中增加资源对象中的
长度
属性

有三种方法可以解决此问题:

[1]您可以创建一个自定义操作方法,该方法具有与
query()
操作方法相同的属性,但具有附加的定义。
transformResponse()
方法在发出请求后但在解决任何承诺之前触发。它与一个JSON字符串一起传递,您可以通过angular.fromJson()将其转换为常规JSON对象,并遍历所有数组,并使用新的可枚举属性扩充每个item对象,让我们调用它
。\u length
,然后返回新的反序列化对象以接收承诺。通过这种方式,
shallowClearAndCopy()
方法复制可枚举的
\u length
属性并将其扩展到资源对象

代码如下所示:

        List<List<Data>> allData = new ArrayList<>();
        allData.add(firstList);
        allData.add(secondList);
[{
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}];

  var DataResource = $resource('data.json', null, {
    'getData': {
      method: 'GET',
      isArray: true,
      transformResponse: function(response) {
        var newData = JSON.parse(response);

        newData.map(function(data) {
          data._length = data.length;
          return data;
        });

        return newData;
      }
    }
  });

  DataResource.getData(function(data) {
    console.log(data);
  });
您应该注意到,在
console.log()
中,它显示每个资源对象项都有一个可以使用的
\u length
属性

[2]另一种方法是使用
$http
服务处理这个特定的用例,这是我能想到的解决这个问题的最简单的方法

$http.get('data.json').success(function(data) {
  console.log(data);
});
[3]要重新考虑您对以下内容的响应数据结构:

        List<List<Data>> allData = new ArrayList<>();
        allData.add(firstList);
        allData.add(secondList);
[{
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}, {
  item: [1,2,3,4,5]
}];

然后,您可以简单地使用
$resource
工厂,并使用
item
键对每个数组项对象进行迭代。

是的,我正在使用$promise,并尝试在获得所有数据后对其进行迭代。问题在于数据返回的格式。非常感谢您的详细回复,您说得对!我尝试了你的代码来增加长度,结果成功了。我将使用它或者重新构造我的数据,但这两个选项都意味着遍历整个集合,所以我需要看看哪个性能更好。再次感谢!