如何使用Angularjs的ng-repeat复选框过滤表格

时间:2015-06-22 09:28:46

标签: javascript angularjs checkbox filter angularjs-ng-repeat

曾几何时,这是有效的,但不知怎的,它已经坏了。我希望能够使用ng-repeat生成复选框,以根据存储的数据获取所需数量的复选框,并使用这些复选框来筛选生成的表格。

此外,我不希望重复复选框的相同值。

我已经用代码制作了一个plnkr。

<div class="row">
    <label data-ng-repeat="x in projects">
        <input
        type="checkbox"
        data-ng-true-value="{{x.b}}"
        data-ng-false-value=''
        ng-model="quer[queryBy]" />
        {{x.b}}
    </label>
</div>

http://plnkr.co/edit/RBjSNweUskAtLUH3Ss6r?p=preview

总结如此。

  1. 用于过滤Ref

  2. 的复选框
  3. 复选框是唯一的。

  4. 使用ng-repeatRef为基础制作复选框。

2 个答案:

答案 0 :(得分:2)

ng-false-value指令需要一个值集。试试ng-false-value='false'ng-false-value='null'(事实上,如果它只是一个假值而不是具体的东西,比如一个字符串或某个数字,你可以完全跳过这一个。)

正如您在评论中指出的那样,在选中然后清除复选框后,所有行都会被过滤掉。这是因为取消选中复选框会将其值设置为false,这与您的实体不一致&#39;价值(你可能知道,只是为别人说明)。

因此,您需要在最后将此值设置为空字符串。这就是方法:

$scope.$watch('quer.$', function () {
  if ($scope.quer.$ === false) {
    $scope.quer.$ = '';
  }
});

答案 1 :(得分:2)

好的,这是怎么做的。

首先,让我们添加几行CSS,以确保所有复选框都可见:

<style>
  .row { margin-left: 0px }
  input[type=checkbox] { margin-left: 30px; }
</style>

接下来,将以下行添加到您的控制器:

app.filter('unique', function() {

  return function (arr, field) {
    var o = {}, i, l = arr.length, r = [];
    for(i=0; i<l;i+=1) {
      o[arr[i][field]] = arr[i];
    }
    for(i in o) {
      r.push(o[i]);
    }
    return r;
  };
})

  app.controller("maincontroller",function($scope){
    $scope.query = {};
    $scope.quer = {};
    $scope.queryBy = '$';
    $scope.isCollapsed = true;
    $scope.selectedRefs = [];

  $scope.myFilter = function (item) { 
    var idx = $scope.selectedRefs.indexOf(item.b);
    return idx != -1; 
  };

  $scope.toggleSelection = function toggleSelection(id) {
    var idx = $scope.selectedRefs.indexOf(id);
    if (idx > -1) {
      $scope.selectedRefs.splice(idx, 1);
    }
    else {
      $scope.selectedRefs.push(id);
    }
  };

呼。

出于某种原因,您的Plunkr版 AngularJS 无法识别unique属性,因此我在您的控制器中添加了一个。

最后,将您的HTML更改为:

<div class="row">
    <label data-ng-repeat="x in projects | unique:'b' | orderBy:'b'" >
        <input
        id="x.b"
        type="checkbox"
        ng-click="toggleSelection(x.b)"
        ng-init="selectedRefs.push(x.b)"
        ng-checked="selectedRefs.indexOf(x.b) > -1" />
        {{x.b}} 
    </label>
</div>

...你的ng-repeat到此...

<tr ng-click="isCollapsed = !isCollapsed" ng-repeat-start="x in projects | filter:myFilter | orderBy:orderProp">

如果您对了解其工作原理感兴趣,请添加以下行:

<div style="margin:10px 10px 30px 10px">
  <pre>{{ selectedRefs }} </pre>
</div>

我喜欢这个技巧:您可以看到我们的“selectedRefs”数组的确切内容,并在我们勾选/取消选中复选框时看到它发生了变化。这在开发/测试我们的绑定时非常有用!

Binding

正如您所看到的,这些更改使用新的unique函数从您的project数组中获取不同值的列表,当页面首次加载时,我们将所有值都推送到我们的新的“selectedRefs”数组。

["123","321","456","654","789","987"] 

然后,当您勾选/取消勾选复选框时,我们会在此列表中添加/删除该项目。

最后,我们在ng-repeat

中使用该过滤器
ng-repeat-start="x in projects | filter:myFilter | orderBy:orderProp"

完成工作!

<强>更新

如果您想从所有复选框未标记开始,那么这是一个简单的更改。只需删除这一行......

ng-init="selectedRefs.push(x.b)"

..并更改myFilter功能以最初显示所有项目..

$scope.myFilter = function (item) { 
    if ($scope.selectedRefs.length == 0)
        return true;

    var idx = $scope.selectedRefs.indexOf(item.b);
    return idx != -1; 
};

要添加“全部清除”按钮,只需在表单中添加一个按钮即可调用AngularJS控制器中的函数。

$scope.clearAll = function () { 
    $scope.selectedRefs = [];
};

(虽然我没有测试过这些建议。)