2013-05-17 142 views
4

對於我AngularJS應用程序我有一個NG重複在NG-重複,像這樣:動態過濾

HTML:

<div ng-app="myApp"> 
    <div ng-controller="myController"> 
     <h2>working filter</h2> 
     <div ng-repeat="category in categories"> 
      <h3>{{category}}</h3> 
      <div ng-repeat="item in items | filter:{price.red: 0} ">{{item.name}}</div> 
    </div> 

     <h2>broken filter</h2> 
     <div ng-repeat="category in categories"> 
      <h3>{{category}}</h3> 
      <!-- price[category] should be red, blue, yellow, depending on the category in the ng-repeat --> 
      <!-- price[category] should be bigger then 0 (or not zero, negative values will not occur) --> 
      <div ng-repeat="item in items | filter:{price[category]: 0} ">{{item.name}}</div> 
     </div> 

    </div> 
</div> 

的Javascript:

var myApp = angular.module('myApp', []); 

myApp.controller('myController', function ($scope) { 

    $scope.categories = ['red', 'blue', 'yellow']; 
    $scope.items = [ 
     {name: 'one', price:{red: 0, blue: 1, yellow: 3} }, 
     {name: 'two', price:{red: 2, blue: 0, yellow: 0}}, 
    ]  

}); 

請看我的jsFiddle http://jsfiddle.net/hm8qD/

所以我遇到了兩個問題:

  1. 的flter不接受括號[],所以我不能讓過濾器動態的基礎上,分類
  2. 過濾器需要返回有價格【類別】大於零的項目。

對於更大的零,我可以做一個自定義過濾器。但據我所知,過濾器不接受參數,所以我無法獲得類別(紅色,藍色或黃色)。

請注意,這是我的實際代碼的簡化版本,這方面可能沒有最好的感覺。我希望我清楚地解釋我需要過濾器做什麼,因爲我是AngularJS的新手。

+1

你可以將你的嘗試轉儲到jsFiddle嗎? –

+0

過濾器的語法:'item in items |過濾:filterCriteria' – TheHippo

+0

是小提琴,請 –

回答

2

顯然,它實際上是可以傳遞參數給你的過濾器,但你必須做出的,而不是使用自定義過濾器「過濾器:表達式」。我所做的是創建一個自定義過濾器,它將項目和類別作爲參數,並將過濾的項目返回給數組。

myApp.filter('myFilter', function() { 
    return function (items, category) { 
     var newItems = []; 
     for (var i = 0; i < items.length; i++) { 
      if (items[i].price[category] > 0) { 
       newItems.push(items[i]); 
      } 
     }; 

     return newItems; 
    } 
}); 

請參閱更新的小提琴這裏:http://jsfiddle.net/hm8qD/3/  

0

我發現發送參數的過濾器不同,相當巧妙的解決辦法(寫在ES6):

$scope.myFilter = (category) => { 
    return (item) => { 
    if(category === 'fish' && item.type === 'salmon'){ 
     return true 
    } 
    return false 
    } 
} 

標記會:

<div ng-repeat="item in items | 
filter:myFilter(someCategory)> 
    {{item.name}} 
</div> 

所以基本上你可以只在範圍內e「category」放入過濾器中,因爲myFilter會根據過濾器預期的格式返回一個函數。