AngularJS 复选框过滤器

标签 angularjs checkbox angularjs-directive angular-ngmodel angular-filters

我想过滤结果。

有一个酒单,我的愿望是当没有选中复选框时,显示整个酒单。

  • 仅选中 1 个复选框时显示相关类别
  • 选中多个复选框时显示相关类别

  • 我是 AngularJS 的新手,我尝试使用 ng-model 没有成功,这里是没有 ng-model 与函数关联的代码:
    <html ng-app="exampleApp">
    <head>
        <title></title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.0-beta.10/angular.min.js"></script>
    
        <script>
            angular.module("exampleApp", [])
                    .controller("defaultCtrl", function ($scope) {
                        $scope.wines = [
                            { name: "Wine A", category: "red" },
                            { name: "Wine B", category: "red" },
                            { name: "wine C", category: "white" },
                            { name: "Wine D", category: "red" },
                            { name: "Wine E", category: "red" },
                            { name: "wine F", category: "white" },
                            { name: "wine G", category: "champagne"},
                            { name: "wine H", category: "champagne" }
    
                        ];
    
    
                        $scope.selectItems = function (item) {
                            return item.category == "red";
                        };
    
                        $scope.selectItems = function (item) {
                            return item.category == "white";
                        };
    
                        $scope.selectItems = function (item) {
                            return item.category == "champagne";
                        };
                    });
        </script>
    </head>
    <body ng-controller="defaultCtrl">
    
    <h4>red: <input type="checkbox"></h4>
    <h4>white: <input type="checkbox"></h4>
    <h4>champagne: <input type="checkbox"></h4>
    
    
    
                <div ng-repeat="w in wines | filter:selectItems">
                    {{w.name}}
                    {{w.category}}
                </div>
    
    
    </body>
    </html>
    

    如何使用 ng-model 或 ng-change 将功能关联到每个复选框按钮以具有实时过滤模型?

    最佳答案

    有几种可能的实现方式。这是一个:

  • 有一个$scope.filter = {}对象来保存每个过滤器的状态。例如。 {red: true, white: false...} .
  • 使用 ng-model 将每个复选框与相应的属性相关联.例如:input type="checkbox" ng-model="filter['red']" /> .
  • 有一个函数(例如 $scope.filterByCategory(wine) )决定是否应该显示葡萄酒(基于 $scope.filter 对象)。
  • 使用该功能根据项目的类别过滤项目。例如。 <div ng-repeat="wine in wines | filter:filterByCategory">

  • filterByCategory函数可以这样实现:
    function filterByCategory(wine) {
      // Display the wine if
      var displayWine =
          // the wine's category checkbox is checked (`filter[category]` is true)
          $scope.filter[wine.category] ||   // or 
    
          // no checkbox is checked (all `filter[...]` are false)
          noFilter($scope.filter);
    
      return displayWine;
    };
    

    在哪里 noFilter()是一个检查是否有任何过滤器被激活的函数(如果没有则返回 true):
    function noFilter(filterObj) {
      return Object.
        keys(filterObj).
        every(function (key) { return !filterObj[key]; });
    }
    

    另见 short demo .

    更新 :

    我创建了一个修改版本,它支持多个过滤器(不仅仅是按类别过滤)。
    基本上,它动态检测可用属性(基于第一个 wine 元素),添加控件(复选框组)以根据每个属性应用过滤器,并具有自定义过滤器功能:
  • 过滤每个 wine项目,基于每个属性。
  • 如果一个属性没有应用过滤器(即没有选中复选框),它将被忽略。
  • 如果属性选中了复选框,则用于过滤掉 wine项目(见上文)。
  • 有使用 AND(即所有属性必须匹配)或 OR(至少一个属性必须匹配)来应用多个过滤器的代码。


  • 另见 updated demo .

    关于AngularJS 复选框过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983322/

    相关文章:

    javascript - 我应该把 AngularJS 工厂和服务放在哪里?

    android - 带有复选框项目的微调器,这可能吗?

    php - Jquery传递复选框值并加载div

    angularjs - Angular : How to get content from a custom div

    javascript - 使用 Angular Js 和 javascript 对输入值进行 json 数据验证

    javascript - 操纵多个元素的 Angular JS 指令

    javascript - 对图像使用分页

    java - 如何在没有操作的情况下取消选中复选框然后进行检查?

    javascript - 带有包含输入 : can it be done cleanly? 的 ng-switch 的 Angular 指令

    angularjs - 在 Jasmine 测试中,promise 的finally 子句永远不会被执行