2013-08-16 3 views
1

Я использую ng-repeat для перебора объектов для отображения в Угловом, и каждый из этих объектов содержит элемент выбора, содержащий свойство объекта.Фильтр динамического выбора элементов в Угловом

Я хочу отфильтровать параметры, основанные на выбранном значении для каждого из других свойств объекта (это сложнее объяснить, чем я думал), но проблема в том, что это объекты Breeze и если я использую традиционный метод Угловое обеспечивает стеки исключение переполнения из-за цикличности сущности Breeze.

Я нашел хороший пример Уорда о том, как создать более статическую функцию для обработки фильтрации, но я стараюсь, чтобы сделать его более динамичным и борюсь -

В представлении у меня есть список доступные бойцы, которые должны быть отфильтрованы по весу класса, состоящие Поединки, так что для каждого боя в боях на нг повторов в есть селектор класса веса, и два истребитель селекторы -

пОПЫТКА 1 -

<select 
    ng-model="fight.firstFighter" 
    ng-options="f.fullName for f in fighters | filter: fighterFilter"> 
</select> 

<select 
    ng-model="fight.weightClass" 
    ng-options="w.fullName for w in weightClasses"> 
</select> 

$scope.fighterFilter = function (fighter) { 
    var fight = ???; 
    return fight.weightClass ? 
     -1 != fighter.weightClass === fight.weightClass : 
     true; 
}; 

Я попытался отправить ничего, как показано на рисунке, но проблема в том, что он посылает только значение истребителя, когда он итерации через каждый доступный боец, поэтому я не могу получить значение боя. WeightClass.

Любая идея о том, как получить контекст борьбы и бойца, который я повторяю? Или лучший подход к фильтрации таким образом?

Истребители Структура

  1. истребитель

    • Id
    • Имя
    • WeightClassId
    • весовой категории (свойство навигации)
  2. Fight

    • FirstFighter
    • SecondFighter
    • WeightClassId
    • весовой категории (свойство навигации)
  3. весовой категории
    • Id
    • Вес
    • Описание
    • ПолноеИмя

Редактировать

я смог отфильтровать результаты с одного боя без проблем, проблема заключается в том, чтобы динамически справляйтесь с этим в каждой битве в том же представлении в соответствии с директивой ng-repeat. Я не могу получить контекст «битвы» и «бойца», чтобы сравнить, соответствует ли значение «весового класса» обоих объектов.

+0

Вы можете разместить структуру данных 'fighters'? – zsong

+0

Это сейчас ... –

ответ

2

Фильтр может принимать expression в качестве Object в формате {fieldName:value}.

Вы можете использовать | filter: {WeightClassId:fight.WeightClass.Id} для достижения желаемого.

<li ng-repeat="fight in fights"> 
    <h4>{{ fight.number }}</h4> 

    Weight Class: 
    <select ng-model="fight.WeightClass" ng-options="w.Name for w in weightClasses"></select>{{ fight.WeightClass.Name }} 

    <br/>First Fighter 
    <select ng-model="fight.FirstFighterId" ng-options="f.Name for f in fighters | filter: {WeightClassId:fight.WeightClass.Id}"></select><span>{{ fight.FirstFighter.Name }}</span> 

    <br/>Second Fighter 
    <select ng-model="fight.SecondFighterId" ng-options="f.Name for f in fighters| filter: {WeightClassId:fight.WeightClass.Id}"></select><span>{{ fight.SecondFighter.Name }}</span> 
</li> 

Demo

+0

Это не работает динамично, но это предполагает, что на каждой странице есть только один бой, где на самом деле много, поэтому я использую ng-repeat. Верный? –

+0

Затем вы можете расширить модель. Я обновил код. – zsong

+0

Итак, в моей попытке 1, когда я статически установил fihgt.weightClass, я мог бы легко заставить его работать, как я уже упоминал, проблема в том, что я не могу получить ценность боя независимо от того, что я делаю. Я пытаюсь понять, изменяется ли какая-либо область, на основе которой заполняется список выбора истребителей, основываясь на вашем ответе, но я не вижу, чтобы битва никогда не заселялась динамически. –

Смежные вопросы