AngularJS ng-опции для исключения конкретного объекта
Я использую угловые ng-опции, чтобы показать с несколькими опциями в качестве выбора родительской категории текущей категории, в основном эти опции содержат все существующие категории, и мне нужно исключить текущую категорию из ng-опций, что вполне делает смысл, потому что категория не может быть родительской категорией самой себя. Так как мне это сделать? В настоящее время у меня есть следующий код:
<tr ng-repeat="category in allCategories">
<th ng-bind="category.name"></th>
<th>
<select ng-options="everyCategory.name for everyCategory in allCategories">
<option value="">Select parent category</option>
</select>
</th>
</tr>
4 ответа
Вы должны использовать фильтр.
<select ng-options="everyCategory.name for everyCategory in allCategories | filter: { name: '!' + category.name }">...</select>
Вы могли бы использовать фильтр
<tr ng-repeat="category in allCategories">
<th>{{category.name}}</th>
<th>
<select ng-options="everyCategory.name for everyCategory in allCategories | filter: {name: '!' + category.name}" ng-model="somthing">
<option value="">Select parent category</option>
</select>
</th>
</tr>
Я создал небольшую скрипку с примером того, как ее использовать: http://jsfiddle.net/krausekjaer/tnqrqk2w/3/
Попробуй это
<tr ng-repeat="category in allCategories">
<th>{{category.name}}</th>
<th>
<select ng-options="everyCategory.name for everyCategory in allCategories | filter: { name: '!' + category.name }" ng-model="somthing">...</select>
<option value="">Select parent category</option>
</select>
</th>
</tr>
Спасибо @Krause и @Kamil R за ответ, но я нашел проблему при использовании их решения, как я упоминал в предыдущих комментариях, если есть 2 категории с одним именем в качестве подстроки другого, фильтр будет перечеркнут оба из них. Например, такие категории, как:candycandybar Использование
filter: { name: '!' + category.name }
отфильтрую их обоих, чтобы убедиться, что фильтруется только один, я в итоге написал собственный фильтр:
app.filter('parentTaxonomyFilter', function(){
return function(items, name){
var arrayToReturn = [];
for (var i = 0; i < items.length; i ++){
if (items[i].name != name) {
arrayToReturn.push(items[i]);
}
}
return arrayToReturn;
};
});
и в HTML, я использую фильтр следующим образом:
<select class="form-control" ng-init="taxonomy.parentTaxonomy=getParentTaxonomy(taxonomy)" ng-model="taxonomy.parentTaxonomy" ng-options="everyTaxonomy.name for everyTaxonomy in data.allTaxonomies|parentTaxonomyFilter:taxonomy.name">
<option value="">select parent taxonomy</option>
</select>