2015-05-14 104 views
2

我有以下阵列:Angularjs NG-如果选择NG重复

$scope.selected_items = [ 
    {id: "12345"}, 
    {id: "67890"} 
] 

$scope.list_items = [ 
    { id: "12345", name: "first", more: "data" }, 
    { id: "22222", name: "second", more: "data2" }, 
    { id: "33333", name: "third", more: "data3" }, 
] 

我试图列出在$scope.list_items谁是id所有项目中不存在$scope.selected_items。我知道我必须做些什么ng-if,但我不知道该怎么做。

<div ng-repeat="data in list_items" ng-if="????"> 
    {{ data.name }} 
</div> 

谁能帮我弄清楚这个问题吗?

回答

2

如果在数组本身内选择了对象,我建议存储信息。

例如为:

的JavaScript

$scope.list_items = [ 
    { id: "12345", name: "first", more: "data", selected: true }, 
    { id: "22222", name: "second", more: "data2" }, 
    { id: "33333", name: "third", more: "data3" selected: true }, 
] 

HTML

<div ng-repeat="data in list_items | filter:{selected:false}"> 
    {{ data.name }} 
</div> 
+1

或者为什么不只是'NG重复= “数据list_items |过滤器:{选择:假}”'或使用[negated](http://stackoverflow.com/questions/13278371/angularjs-filter-negated)并避免ng显示 – PSL

+0

感谢罗杰。我修改了我的代码来处理这个问题。我很欣赏快速答案。什么是更有效的@PSL? 'ng-if','filter'或者'ng-show' – bryan

+1

@bryan最有效的方法是在控制器中进行过滤(保留过滤列表并将其绑定到DOM并在选择项目时更新过滤列表)...因此表达式不会在每个摘要循环中被评估。即'$ scope.filtered = $ scope.list_items.filter(function(itm){return!itm.selected})''。如果你在DOM上使用过滤器,ng-if,ng-show他们都会创建一个观察者。 – PSL

1

既然你提到你不能保持选中状态的list_items阵列本身英寸你可以在ng-if中调用一个函数,并使用一个函数检查选中项是否存在。

<div ng-repeat="data in list_items" ng-if="checkItem(data)"> 
    {{ data.name }} 
    </div> 

功能将这个样子,

$scope.checkItem = function(item) 
    { 
    for(var i=0;i<$scope.selected_items.length;i++) 
    { 
     var sItem = $scope.selected_items[i]; 
     if(sItem.id===item.id) 
     return false; 
    } 
    return true; 
    } 

plnkr链接http://plnkr.co/edit/3a4zoKIKFABAmif0fKFt?p=preview

+0

感谢Kathir的工作。我一定会牢记这一点,但它看起来像选定的标签更有效,所以我修改了我的代码。 – bryan

+0

我会同意这是有效的方式。 – Kathir

1

如果一定要在你的榜样分开,你最好的办法是创建项目的新数组你想要重复。

所以,你会做的是类似的东西:

$scope.newList = []; 
for (var i=0; $scope.list_items.length < i; i++) { 
    for (var s=0; $scope.selected_items.length < s; s++) { 
    if ($scope.selected_items[s].id == $scope.list_items[i].id) { 
     $scope.newList.push($scope.list_items[i]); 
    } 
} 

这将是理想的做什么我上面的人说,让所有的这一个对象,只是有一个显示:真/假标志在那里。

1

那么,正确的模式将是使用AngularJS过滤器。

你刚才的过滤器添加到您的ngRepeat:

myApp.filter('selectedItems', function() { 
    return function (values, selectedItemsArr) { 
     console.log(values, selectedItemsArr) 

     var arrayToReturn = []; 
     // Loops through the values in the list 
     for (var i = 0; i < values.length; i++) { 

      // Now loops through the selected items array to see if it matches 
      for (var l = 0; l < selectedItemsArr.length; l++) { 
       if (values[i].id === selectedItemsArr[l].id) { 
        arrayToReturn.push(values[i]); 
       } 
      } 
     } 

     return arrayToReturn; 
    }; 
}); 

这里举例:http://jsfiddle.net/Nitrium/3vcs445c/1/