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>
Другие вопросы по тегам