在ng-options中按数组过滤

时间:2015-02-06 10:56:12

标签: angularjs

我想在ng-options中过滤那些符合对象内某个条件的对象列表。

例如我有这样的数据:

{
        id:1,
        type:"Type A",
        name:"loc 1",
        items:[
            {id:1, name:"item 1"},
            {id:2, name:"item 2"},
            {id:3, name:"item 3"},
        ]
    },

我的选择看起来像这样

<select ng-model="test" ng-options="location as (location.name + ' ' + location.items.length + ' items') group by location.type for location in locations | filter:{items.length:filterBy.itemId}">
</select>

下面的示例通过按列表中的项目数过滤列表来工作,但我想要做的是按照那些具有条件(例如具有id = 1的项目的所有对象)的列表来过滤列表。

这是上面提到的工作小提琴。

fiddle example

我想要/期望(伪)的东西:

ng-options="location as (location.name + ' ' + location.items.length + ' items') group by location.type for location in locations | filter:{items{id:filterBy.itemId}}"

甚至可能吗?

更新:上面的小提琴已经更新了@Marcos Sandrini下面的答案中的代码,以防万一有需要。

2 个答案:

答案 0 :(得分:0)

您可以按功能过滤

this.filterFunction = function(item) {
      return item.itemId===1;
}

所以你只需要使用

filter:filterFunction

答案 1 :(得分:0)

如果您坚持使用ng-options,那么您总是可以选择在ng-repeat中使用options标记执行任何操作,而不是所有内容的理想情况,但它可以正常工作在大多数情况下,它更具可读性和可理解性,特别是对于更复杂的情况。

<option value="{{location.id}}">
   {{location.name + ' ' + location.items.length + ' items' | orderBy: 'location.type' | filter:IdFilter(location,idToFilter)}}
</option>

确保你没有使用ng-show和ng-hide与选项标签,它不会工作(使用ng-if代替)。过滤功能如下:

function IdFilter(location,idToFilter){
  var hasId = false;
  angular.foreach(location.items, function(l){
    if (l.id===idToFilter) hasId = true; 
  }
  return hasId;
}