Angular ng-repeat,每个父循环的嵌套重复

时间:2015-06-17 00:06:10

标签: angularjs angularjs-ng-repeat

我在获取正确的数据方面遇到了一些麻烦。我有多对多关系模型,所以它有3个表,两个有数据,第三个是它们之间的连接(通过ID)。例如,第一个表是商店,第二个是商品,第三个是'have',它们通过id连接它们。

现在我应该显示每个商店的可用商品。我正在使用ng-repeat =“store in stores”来遍历商店,并尝试创建将返回每个商店中可用商品的函数(store.idStore)。

我尝试了几种方法,似乎没有一种方法适合我,而且因为我是角色的新手,所以我有点失落。我将不胜感激任何帮助。

我使用的最后一项功能是:

function forEachStore(id) {
                        angular.forEach($scope.Have, function (value, index) {
                            if (idStore == id) {                          

alert(idPlayliste);
                                this.push(dataFact.catchData(urlItem, idItem));
                            }
                        }, $scope.storeHasItem)
                    }

$ scope.Have - &gt;包含json对象,如({“id”:1,“idStore”:1,“idItem”:1},{“id”:2,“idStore”:1,“idItem”:2},...)< / p>

dataFact.catchData - &GT;我的工厂获取api url和idItem并返回json对象(这是正常工作)。

id == store.idStore从ng-repeat发送。

所以,我发送给这个函数'store.idStore',我想让它返回该商店中可用的所有商品。

我没有提醒:)

3 个答案:

答案 0 :(得分:0)

编辑: 在评论启发第二读:)。

我认为idStore应为value.idStore(此处:

angular.forEach($scope.Have, function (value, index) {
                            if (idStore == id) {     ... })};

还有: angular.forEach(obj,iterator,[context]),其中context将提供&#39; this&#39;对于迭代器。您将上下文设置为$ scope.storeHasItem - $ scope上的一个函数,我猜它不是您追求的目标。

旧答案:

当您使用ng-repeat="store in stores"时,您会得到以下内容:store = stores [0]在范围内+视图中的dom模板(您在其中的元素的副本&#39;我把重复)...然后存储=存储[1]和副本......等等

因此在函数中,您获得的参数是整个商店对象,而不仅仅是id。试试console.log - 它应该澄清一些事情。

答案 1 :(得分:0)

从您的代码看起来$scope.stores是一个Store对象数组。我假设你有类似物品的东西。在第一个ng-repeat循环中,添加类似ng-repeat="item in getItemsForStore(store.idStore)"的内容以启动内部循环,并将以下函数添加到范围(尚未测试):

$scope.getItemsForStore = function(storeId) {
  var items = [];
  for (var have = $scope.have, i = 0, len = have.length; i < len; i++) {
    var link = have[i];
    if (link.idStore === storeId && !items.contains(link.idItem) {
      items.push(link.idItem);
    }
  }
  for (int j = 0, len = items.length; j < len; j++) {
    items[j] = getItem(items[j]);
  }
  return items;
}

function getItem(itemId) {
  for (var i = 0, items = $scope.items, len = items.length; i < len; i++) {
    var item = items[i];
    if (item.idItem === itemId) {
      return item;
    }
  }
  throw "unknown item ID: " + itemId;
}

如果您使用对象而不是数组,其中的项目/存储由ID键入,那么事情可能会更有效率。

答案 2 :(得分:0)

function Ctrl($scope){
    $scope.stores =[
        {id:1,name:'store 1'},
        {id:2,name:'store 2'},
        {id:3,name:'store 3'},
        {id:4,name:'store 4'}
    ];
    $scope.items =[
        {id:1, name:'item 1'},
        {id:2, name:'item 2'},
        {id:3, name:'item 3'},
        {id:4, name:'item 4'},
        {id:5, name:'item 5'},
        {id:6, name:'item 6'},
    ];
    
    var storeItemLinked= [
        {sId:1,iId:1},
        {sId:1,iId:2},
        {sId:1,iId:3},
        {sId:2,iId:4},
        {sId:2,iId:5},
        {sId:2,iId:6},
        {sId:3,iId:1},
        {sId:3,iId:3},
        {sId:3,iId:5},
        {sId:4,iId:2},
        {sId:4,iId:4},
        {sId:4,iId:5}           
        
    ];
    $scope.selectedStoreItems=[];
    $scope.showStoreItems=function(store){
        $scope.selectedStoreItems=[];
        $scope.selectedStore=store;
        var itemIds=[];
        for(var i=0;i<storeItemLinked.length;i++){
            if(storeItemLinked[i].sId==store.id)
                itemIds.push(storeItemLinked[i].iId);
        }
                for(var j=0;j<$scope.items.length;j++){
            if(itemIds.indexOf($scope.items[j].id)>=0)
               $scope.selectedStoreItems.push($scope.items[j]);
        }
    }
    
    $scope.showAvailableStores = function(item){
        $scope.selectedItem=item;
        $scope.selectedItemStores=[];
        
        var storeIds=[];
        for(var i=0;i<storeItemLinked.length;i++){
            if(storeItemLinked[i].iId==item.id)
                storeIds.push(storeItemLinked[i].sId);
        }
                for(var j=0;j<$scope.stores.length;j++){
            if(storeIds.indexOf($scope.stores[j].id)>=0)
               $scope.selectedItemStores.push($scope.stores[j]);
        }
    }
    
    
        
    
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.11/angular.min.js"></script>
<div ng-app ng-controller="Ctrl">
    <ul>
        <li ng-repeat="store in stores" ng-click="showStoreItems(store)">{{store.name}}
            <ul ng-show="selectedStore==store">
                <li ng-repeat="item in selectedStoreItems" ng-click="showAvailableStores(item)">
                    {{item.name}}
                    <ul ng-show="selectedItem==item">
                        <li ng-repeat="store in selectedItemStores">{{store.name}}</li>
                    </ul>
                </li>
                
            </ul>
        </li>
    </ul>
</div>

点击商店将列出所有可用商品,然后点击商品将列出销售该商品的所有商店

我只是通过一些js对象来模拟数据库,你可能想要更改那些ng-click函数来获取远程数据,里面的逻辑将取决于从服务器返回的视图模型