2015-10-06 3 views
0
<ul ng-repeat="cate in restaurant.categories"><li>{{cate}}</li> 
    <li ng-repeat="menuItem in restaurant.menuItems" ng-show="menuItem.category == cate">{{menuItem.name}}</li></ul> 

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

Категории и menuItem - это два разных массива. Если категория menuItem находится под текущей категорией, она должна быть добавлена ​​на страницу.

menuItems = {{name: dish1, category:soup}, 
      {name: dish2, category:beef}} 
categories = {beef, soup}     
+0

Вы должны показать пример '' categories' и данные menuItems' и/или в идеале, пример Plunker – Phil

+0

Вам нужно использовать фильтр во внутреннем нг-повторе для фильтрации второго массива. Просто поделитесь всем своим массивом здесь, и я помогу вам достичь этого. –

ответ

2

@ show-me-the-code: Билл Би имеет два разных массива. Поэтому наилучшим вариантом для этого является фильтр внутри цикла, как указано в моем комментарии.

Вот окончательный код с фильтром для внутреннего контура. Я включил скрипач для быстрой справки.

<div ng-app ng-controller="testCtrl"> 
    <ul ng-repeat="cate in categories"> 
     <li>{{cate}}</li> 
     <li ng-repeat="menuItem in menuItems | filter:{category: cate}">{{menuItem.name}}</li> 
    </ul> 
</div> 

function testCtrl($scope) { 
    $scope.menuItems = [{name: 'dish1', category:'soup'}, 
      {name: 'dish2', category:'beef'}]; 
    $scope.categories = ['beef', 'soup'] 
} 

Fiddle: JSFiddle

+0

Я бы сделал сравнение фильтра строгим, чтобы избежать совпадений, где 'menuItem.category' * содержит *' cate', например '| filter: {category: cate}: true' – Phil

+0

Да, это отлично работает для меня. –

+0

@Bill Bi: Пожалуйста, отметьте этот ответ как ответ, если это полезно, чтобы помочь понять другого члена стека. –

0

Я хотел бы изменить представление данных, чтобы соответствовать тому, что вы на самом деле пытается отобразить следующим образом:

$scope.restaurant = { 
    categories: [{ 
     name: "beef", 
     menuItems: [{ 
      name: "dish1", 
      "price": "$10" 
     }, { 
      name: "dish2", 
      "price": "$15" 
     }] 
    }, { 
     name: "soup", 
     menuItems: [{ 
      name: "dish1", 
      "price": "$20" 
     }, { 
      name: "dish2", 
      "price": "$25" 
     }] 
    }] 
}; 

Таким образом, вы можете легко соответствовать вашим два вложенных цикла, как это:

<div ng-app ng-controller="testCtrl"> 
    <ul ng-repeat="cate in restaurant.categories"> 
     <li>{{cate.name}}</li> 
     <li ng-repeat="menuItem in cate.menuItems">{{menuItem.name}} - {{menuItem.price}}</li> 
    </ul> 
</div> 

Проверьте this fiddle, если вы хотите увидеть его в действии. Если вам нужно придерживаться данных JSON, вам придется выполнять фильтрацию, чтобы вытащить содержимое, которое вы хотите отобразить.

+0

Это хороший выбор, но мне не разрешено изменять базу данных. –

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