You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AngularJS传递多数组至scope.list遇ngRepeat重复项错误求助

解决AngularJS ngRepeat重复项错误及多请求处理问题

首先咱们先拆解下你代码里的几个核心问题,这也是导致报错的根源:

  • $http 并不支持同时传入两个请求配置对象,它单次只能处理一个请求——所以你的requestMenu其实根本没被执行,最后arrBirds和arrMenu都被赋值了同一个data.json的数据
  • 用+拼接数组是错误操作,这会把数组直接转换成字符串,而非合并两个数组,这种畸形的数据结构直接触发了ngRepeat的重复项报错

正确解决方案:用$q.all并行处理多请求

AngularJS的$q.all可以帮你同时发起多个异步请求,等所有请求都成功返回后再统一处理数据,这样就能正确获取两个JSON文件的内容,再完成数组合并。

修改后的控制器代码如下:

var app = angular.module('myApp', ['ngSanitize']);
app.controller('myController', function ($scope, $http, $sce, $q) {
  // 分别定义两个请求
  var requestBirds = $http({ 
    method: 'get', 
    url: 'scripts/data.json', 
    contentType: "application/json" 
  });
  var requestMenu = $http({ 
    method: 'get', 
    url: 'scripts/menu.json', 
    contentType: "application/json" 
  });

  // 并行发起两个请求,等待全部完成后处理结果
  $q.all([requestBirds, requestMenu])
    .then(function (responses) {
      // responses[0]对应第一个请求的返回数据,responses[1]对应第二个
      $scope.arrBirds = responses[0].data;
      $scope.arrMenu = responses[1].data;
      // 用concat方法正确合并两个数组(代替错误的+操作)
      $scope.list = $scope.arrBirds.concat($scope.arrMenu);
    })
    .catch(function (error) {
      console.error('请求出错:', error);
    });
});

额外处理ngRepeat重复项

如果合并后的list里确实存在内容重复的元素(比如有相同id的对象),可以在ngRepeat指令里加上track by来指定唯一标识,避免报错:

<div ng-repeat="item in list track by item.id">
  <!-- 你的页面内容 -->
</div>

如果数据里没有现成的唯一标识,也可以临时用track by $index(不过更推荐给数据添加唯一ID,这是更规范的做法)。

内容的提问来源于stack exchange,提问作者Cromwell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:00:02