我想在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的项目的所有对象)的列表来过滤列表。
这是上面提到的工作小提琴。
我想要/期望(伪)的东西:
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下面的答案中的代码,以防万一有需要。
答案 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;
}