【问题标题】:AngularJS ngRepeat - Use checkbox to filter list by single object propertyAngularJS ngRepeat - 使用复选框按单个对象属性过滤列表
【发布时间】:2018-05-31 18:05:02
【问题描述】:

JSFiddle:http://jsfiddle.net/ADukg/16923/.

我正在尝试在值与特定属性匹配的列表中过滤项目。

我有一个 'shownEmployees' 数组,当一个 'Show Leavers?'选中复选框,我希望 ng-repeat 列表包含“离开者”属性为“是”的对象,否则,它应该拼接它们。如果属性为“否”,则该对象应始终包含在 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);
        }
    })

}

})

【问题讨论】:

  • Fiddle 中的代码存在多个问题。首先,您不能将scope.showLeavers 声明为ng-repeat 的布尔值和具有相同名称的ng-change 的函数。其次,您的逻辑在函数中是错误的,并且试图将项目推回源数组(创建重复项)而不是推入新的空白数组。而且没有任何理由拼接不必要的项目,因为它们不会出现在空白数组中。

标签: javascript arrays angularjs filter angular-filters


【解决方案1】:

使用自定义过滤器:

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

【讨论】:

  • 他不需要为此行为创建自定义过滤器。这是一个例子jsfiddle.net/ADukg/16925。问题是,当离开复选框为真时,他需要添加(显示全部)......而不是按真/假过滤。至少这是我所理解的。
  • 这不提供我上面提到的功能。 'leaver' 属性为 'No' 的员工需要一直被包括在内
【解决方案2】:

你应该改变函数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">

【讨论】:

    【解决方案3】:

    您需要对代码进行一些更改。请尝试下面的代码并查看并与您的代码进行比较。

    var app = angular.module('myApp',[]);
    
    app.controller('mainController', function($scope) {
    
    	var scope = $scope;
      $scope.showLeaver=false;
    
    	scope.employees  = [
      	{
        	name: 'Employee One',
          leaver: 'No'
        },
      	{
        	name: 'Employee Two',
          leaver: 'No'
        },
      	{
        	name: 'Employee Three',
          leaver: 'Yes'
        }
      ]
      
      $scope.shownEmployees = $scope.employees;
    	    	$scope.showLeavers = function() {
      var isYes = $scope.showLeaver == true? 'Yes':'No';
    	$scope.shownEmployees =	$scope.employees.filter(function (el) { return el.leaver ==  isYes });
    
    	}
    $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>

    【讨论】:

    • 非常不稳定的代码。 Initially shows all employees, leaver or not, which it shouldn't, and when show leavers selected, shows non-leavers.然后在未选择显示离开者时显示离开者。还需要一直显示非离开者,如问题中所述
    • @nick.cook 然后把这一行改成var isYes = $scope.showLeaver == false? 'Yes':'No'; 可以请你现在检查一下吗?
    • 请阅读问题...如果“离开者”为“否”,则应始终包含对象。正如我在问题中所问的那样,更改上述内容仍无法解决此问题
    【解决方案4】:

    更新:

    使用下面的方法修复它。选中复选框时,显示离开者和非离开者。未选中时,仅显示非离开者。没有 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;
    
      }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 2016-08-10
      • 2015-02-20
      • 2015-06-04
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多