2015-04-01 2 views
0

Мне нужно показать объект, только если одно из его свойств равно массиву.Equal Arrays AngularJS Pro

У меня есть контроллер в app.js:

app.controller('checkBoxController', function ($scope) { 
    $scope.ingredients= [ 
     {label: 'Egg', value: 1}, 
     {label: 'Milk', value: 2}, 
    $scope.selection=[]; 
    $scope.toggleSelection = function toggleSelection(ingredientLabel) { 
     var idx = $scope.selection.indexOf(ingredientLabel); 
     if (idx > -1) { 
      $scope.selection.splice(idx, 1); 
     } 
     else { 
      $scope.selection.push(ingredientLabel); 
     } 
    }; 
}); 

и HTML-код для него:

<span style="color:black;" class="selected-item">Selected Items:<span> 
<div ng-repeat="label in selection" class="selected-item"> 
</div> 
<div class="list-group"> 
    <div class="list-group-item" ng-repeat="product in meals.products" ng-show="product.contents==selection"> 
     <h1>{{product.name}}</h1> 
     <meal-gallery></meal-gallery> 
     <meal-tabs></meal-tabs> 
    </div> 
</div> 

и у меня есть { name: 'Scrambled Egg', contents: "Egg"} в массиве продукции. Поэтому мне нужно показать продукт, если его содержимое равно выбранным ингредиентам. У меня нет проблем, когда это только один ингредиент, такой как «Яйцо», но если мне нужно содержимое из двух равных выбранным?

+0

angularjs pro? это какой-то модуль? Похоже, вы внедрили опечатку в свой код при публикации здесь, ваш массив не завершен. –

+0

Если оба объекта не являются буквально одним и тем же объектом, вы не можете использовать indexOf таким образом. 'var x = {}; var y = x; x == y; // true '' var x = {'name': 'pie'}; x == {'name': 'pie'}; // false' –

ответ

0

Используйте фильтр.

<div ng-repeat=product in products |filter: product.a === a && product.b === b> 

Вы также можете использовать функцию фильтра. Это функция, которая принимает элемент и возвращает Boolean

+0

Не могу ли я использовать массив для содержимого продукта? Например: {name: 'Scrambled Egg', содержимое: ["Egg", "Milk"]} –

+0

yes that выглядит лучше – rrrkren

+0

Но у меня есть проблема. Как-то у меня работает мой код, только когда product.contents == selection и «Egg» (from product.content) == ["Egg"]. Это странно. Я не могу понять, в чем проблема –

1

Лучше всего использовать собственный фильтр.

Если добавить lodash в приложение, вы можете создать фильтр, который будет преформами следующей операции:

angular.module('common', []) 
.filter('canBeMadeFrom', function() { 
    return function(product, ingredients) { 
    return _.intersection(product.contents, ingredients).length == product.contents.length'; 
    }; 
}); 

это возвращает истину, если все продукты содержания содержится в ингредиентах

использовать например

ng-repeat='product in products | canBeMadeFrom:ingredients' 
+0

Но мне нужно вернуть true, только если точные элементы находятся в файле product.contents и false, если хотя бы один из них не является –

+0

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