【问题标题】:AngularJS Nested ng-repeat that connects with the ID from two JSON arraysAngularJS 嵌套 ng-repeat 连接来自两个 JSON 数组的 ID
【发布时间】:2018-07-16 16:58:17
【问题描述】:

我正在尝试找到将两个数组连接在一起的最佳方法,我猜想是嵌套的 ng-repeat。这是我可用的数据(非常简短的示例);

GameGenre Table
ID    |    Genre
1     |    Action
2     |    First Person Shooter
3     |    Adventure

Game Table
ID    |    IDGenre   |  Name
1     |    1         |  SpiderMan
2     |    1         |  Batman
3     |    2         |  Wolfenstein
4     |    3         |  Just Cause
5     |    3         |  Tomb Raider
6     |    3         |  Indiana jones

所以我正在寻找将两个数组组合在一起的最佳方式(一种方式/禁食方式),所以我把它弄出来

IDGameGenre 1 Holds: GAMEID1 and GameID2
IDGameGenre 2 Holds: GameID3
IDGameGenre 3 Holds: GameID4, GameID5, GAMEID6

这是我目前想出的,我首先消耗两个数组:

在控制器中:

 $http({
     method: 'Get',
     url: http://URL/api/GameGenre/All"
 })
     .success(function (data) {
          $scope.GameGenre= data;
     });

 $http({
     method: 'Get',
     url: http://URL/api/Game/All"
 })
     .success(function (data) {
          $scope.Game= data;
     });

 $scope.getTheGame = function(ID) {
     return Game.get({IDGenre: ID});
 };

在 HTML 中

<div class="listing" ng-repeat="Genre in GameGenre" ng-init='getTheGame(Genre.ID)'>
       <div class="Game" ng-repeat="Game in getTheGame"></div>
</div>

但我似乎无法完成这两项工作,我如何能够首先使用这两个数组,将它们都添加到范围,然后对信息进行排序。

【问题讨论】:

  • 为什么不在后端添加该功能?在您的 GameGenre 类中,添加一个游戏列表,然后在该列表中添加所有反对该类型的游戏。使用这种方法,您也不必对后端进行两次单独的调用
  • 不幸的是我不能

标签: arrays angularjs angularjs-ng-repeat


【解决方案1】:

首先,您的 $http 请求是异步的。您需要链接它们,或者同步解析,这可以通过$q.all() 完成。然后,一旦解析并填充到数组中,您就可以操作它们并为您的表创建一个新数组。我发现 2 个 for 循环是最简单的方法(祝你好运 .map/.reduce/etc.)。

这是一个静态示例:

var app = angular.module('myApp', []);
app.controller('myCtrl', function($scope, $http, $q) {
  /*
  var GGpromise = $http(...).then(function (res) {
    return res.data;
  });
  var Gpromise = $http(...).then(function (res) {
    return res.data;
  });
    
  $q.all([GGpromise, Gpromise]).then(function(res){
    var GG = res...;
    var G = res...;
  }).finally(function(){
    // main code here:
    // ...
  })
  */
  
  var GG = [
    {"ID":1,"Genre":"Action"},
    {"ID":2,"Genre":"First Person Shooter"},
    {"ID":3,"Genre":"Adventure"}
  ];
  var G = [
    {"ID":1,"IDGenre":1,"Name":"Spider Man"},
    {"ID":2,"IDGenre":1,"Name":"Batman"},
    {"ID":3,"IDGenre":2,"Name":"Wolfenstein"},
    {"ID":4,"IDGenre":3,"Name":"Just Cause"},
    {"ID":5,"IDGenre":3,"Name":"Tomb Raider"},
    {"ID":6,"IDGenre":3,"Name":"Indiana Jones"}
  ];

  $scope.games = [];
  for (var i = 0; i < GG.length; i++) {
    var temp = {};
    temp.IDGameGenre = GG[i].ID;
    temp.Holds = [];
    for (var j = 0; j < G.length; j++) {
      if (GG[i].ID == G[j].IDGenre) {
        temp.Holds.push(G[j].ID);
      }
    }
    $scope.games.push(temp);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.9/angular.min.js"></script>
<div ng-app="myApp" ng-controller="myCtrl">
  <pre>{{games | json}}</pre>
</div>

【讨论】:

    【解决方案2】:

    或者您可以尝试以下方法:-

    <ul>
        <li ng-repeat="Genre in GameGenre">{{ Genre.Name }}</li>
        <ul>
            <li ng-repeat="Game in GameArray" ng-if="Game.GenreId == Genre.Id">{{ Game.Name }}</li>
        </ul>
    </ul>
    

    【讨论】:

    • 我知道我在工作,但它会忽略所有选项,现在想象一下我的游戏列表大约有 50.000 行。所以我认为这不是最好的选择。
    • 但是,这是一个非常简单的解决方案,如果我像 Aleksey 的示例那样在控制器中完全不识字,会有什么区别?还有其他人对性能有什么想法吗?
    • @EwaldBos 您需要通过一次性数据绑定来减少 观察者 的数量。将ng-repeat="x in array" 语法更改为ng-repeat="x in ::array",并将{{x}} 更改为{{::x}}。您还可以使用过滤器限制显示的元素数量:ng-repeat="... | limitTo : 100 : 0"从 0 开始显示 100,可以是动态的)。请注意,ngRepeat 为数组中的每个 (!) 元素创建一个内部范围
    • @EwaldBos 如果一种类型有可能有 50,000 场比赛与之对抗,假设你有 10 种类型,那么总共有 500,000 场比赛,所以很明显你不能将所有数据放在一个页面那么如果你不能把它放在一个页面中,你为什么要打电话来获取所有的数据呢?仅从您的后端获取当前页面所需的数据。
    • @EwaldBos 我建议您重新考虑您的设计,例如呈现一个流派列表,然后从列表中单击一个流派,转到一个单独的页面并在新页面上调用您的后端,类似于“GetGamesByGenreId”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多