2017-12-18 255 views
1

JSFiddle:http://jsfiddle.net/ADukg/16923/AngularJS ngRepeat - 使用複選框按單個對象屬性過濾列表

我試圖過濾列表中某個值與特定屬性匹配的列表項。

我有'shownEmployees'數組,當'Show Leavers?'時複選框被選中,我想ng-repeat列表包含'leaver'屬性爲'Yes'的對象,否則它應該拼接它們。如果該屬性爲「否」,則該對象應始終包含在shownEmployees數組中。

我已經做了什麼應該是更復雜的過濾器使用$ filter指令的多個參數,但不能找出一個簡單的方法來過濾只有一個屬性。

HTML:

<md-list-item ng-repeat="employee in allEmployees.shownEmployees | orderBy: sortEmployees | filter:searchEmployees"> 

<md-checkbox ng-change="allEmployees.showLeavers()" ng-model="allEmployees.filters.showLeavers">Show Leavers?</md-checkbox> 

-

我已經試過在JS做:

app.controller('allEmployeesController', function($scope, $http, $document) { 

var _this = this; 

$scope.sortEmployees = '+surname' 

this.shownEmployees = $scope.employees; 

this.filters = { 
    showLeavers: false 
} 

console.log('Showing leavers?: ' + this.filters.showLeavers); 

this.showLeavers = function() { 

    console.log('Showing leavers?: ' + this.filters.showLeavers); 

    angular.forEach($scope.employees, function(value, key) { 
     if (value.leaver === 'Yes') { 
      if (_this.filters.showLeavers) { 
       _this.shownEmployees.push(value); 
      } else { 
       _this.shownEmployees.splice(value); 
      } 
     } 
     if (value.leaver === 'No') { 
      _this.shownEmployees.push(value); 
     } 
    }) 

} 

})

+0

有在你的小提琴代碼多個問題。首先,你不能將'scope.showLeavers'聲明爲'ng-repeat'的布爾值和具有相同名稱的'ng-change'的函數。其次,你的邏輯在函數中是錯誤的,並且試圖將項目推回源數組(創建重複項)而不是推入新的空白數組。沒有任何理由拼接不必要的項目,因爲這些項目不會出現在空白數組中。 – Claies

回答

2

使用自定義過濾器:

app.filter('myfilter', function() { 
    return function(items, showLeavers) { 
    var filtered = []; 

    var show = (showLeavers) ? 'Yes' : 'No' 

    angular.forEach(items, function(item) { 
     if(show == item.leaver) { 
      filtered.push(item); 
     }  
    }); 

    return filtered; 
    }; 
}); 

和:

<li ng-repeat="employee in shownEmployees | myfilter:showLeavers"> 

Demo Fiddle

+0

他不需要爲此行爲創建自定義過濾器。這裏有一個例子http://jsfiddle.net/ADukg/16925/。事情是,他需要添加(顯示所有)當離開復選框是市場爲真...沒有過濾真/假。至少這是我所瞭解的。 –

+0

這不提供我上面所述的功能。需要隨時包含'離線'屬性的員工 –

+0

正如我所想象的那樣... –

0

你需要做一些改變你的代碼。請嘗試下面的代碼,並看看並與您的代碼進行比較。

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

 
app.controller('mainController', function($scope) { 
 

 
\t var scope = $scope; 
 
    $scope.showLeaver=false; 
 

 
\t scope.employees = [ 
 
    \t { 
 
    \t name: 'Employee One', 
 
     leaver: 'No' 
 
    }, 
 
    \t { 
 
    \t name: 'Employee Two', 
 
     leaver: 'No' 
 
    }, 
 
    \t { 
 
    \t name: 'Employee Three', 
 
     leaver: 'Yes' 
 
    } 
 
    ] 
 
    
 
    $scope.shownEmployees = $scope.employees; 
 
\t  \t $scope.showLeavers = function() { 
 
    var isYes = $scope.showLeaver == true? 'Yes':'No'; 
 
\t $scope.shownEmployees = \t $scope.employees.filter(function (el) { return el.leaver == isYes }); 
 

 
\t } 
 
$scope.showLeavers(); 
 

 
    
 
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="myApp" ng-controller="mainController"> 
 

 
    <input ng-click="showLeavers()" ng-model="showLeaver" value="" type="checkbox" /> 
 
    
 
    <label for="showLeavers">Show Leavers?</label> 
 
    
 
    <ul> 
 
    
 
    <li ng-repeat="employee in shownEmployees"> 
 
     
 
     <p>Name: {{employee.name}}</p> 
 
     
 
    </li> 
 
    
 
    </ul> 
 
    
 
</div>

+0

非常不穩定的代碼。最初顯示所有員工,不管是否離職,以及何時選擇離職者,顯示非離職者。然後顯示當離場者未被選中時的離職者。還需要始終顯示非離開者,如問題 –

+0

@ nick.cook中所解釋那麼只需將此行更改爲'var isYes = $ scope.showLeaver == false? '是':'不';'你能檢查一下嗎? –

+0

請閱讀這個問題......在哪裏「離開」是「否」,應始終包括對象。正如我在問題中所提到的那樣,改變上述方法仍然不能解決問題 –

0

你應該改變功能的js

this.showLeavers = function(item) { 
     this.shownEmployees = []; 
      if(item){ 
      angular.forEach($scope.employees , function(list){ 
      if(list.leaver === 'Yes') 
      this.shownEmployees.push(list); 
      }) 
     }else{ 
      this.shownEmployees = angular.copy($scope.employees); 
     } 
    } 

和HTML

<input ng-change="showLeavers(allEmployees.filters.showLeavers)" ng-model="allEmployees.filters.showLeavers" type="checkbox" id="showLeavers"> 
0

更新:

用下面方法修復它。選中複選框後,顯示離職者和非離職者。未選擇時,僅顯示非離開者。沒有ng-hide表達式,不使用控制器。 $ filter指令中獨立的方法。

showLeaver表達式作爲參數傳遞給showLeavers過濾器。

HTML:

<md-list-item ng-repeat="employee in employees | orderBy: sortEmployees | filter: searchEmployees | showLeavers:showLeaver"> 

<md-checkbox ng-model="showLeaver">Show Leavers?</md-checkbox> 

JS:

app.filter('showLeavers', function() { 
    return function (employees, showLeaver) { 
    var matches = []; 

    for (var i = 0; i < employees.length; i++) { 

     if (employees[i].leaver === 'No') { 
     matches.push(employees[i]); 
     } 

     if (employees[i].leaver === 'Yes' && showLeaver) { 
     matches.push(employees[i]); 
     } else if (employees[i].leaver === 'Yes' && showLeaver == false) { 
     matches.splice(employees[i]); 
     } 

    } 

    return matches; 

    } 
})