简体   繁体   English

使用AngularJS的复选框过滤对象属性

[英]Filtering on object property with checkbox with AngularJS

I have an ng-repeat list displaying multiple properties of an array of objects and the possibility to filter it using input fields. 我有一个ng-repeat列表,显示对象数组的多个属性,并可以使用输入字段对其进行过滤。

What I didn't manage to do is to implement the possibility to filter the results using a checkbox and the existance or not of a specific object.property. 我没有设法做的事情是实现使用复选框过滤结果的可能性,以及是否存在特定object.property。

Basically I want it to display the results where record.cancelled = true when the checkbox is checked, and all the results if it remains unchecked. 基本上,我希望它在选中复选框时显示结果,其中record.cancelled = true,如果未选中,则显示所有结果。

Heres my HTML: 这是我的HTML:

   <div class="row msf-row" 
     ng-repeat="record in recordlist | filter: search" 
     ng-class="{ 'msf-cancelled': record.cancelled}">
      <div class="col-md-1">{{record.time}}</div>
      <div class="col-md-1"><strong>{{record.car}}</strong></div>
      <div class="col-md-2">{{record.driver}}</div>
      <div class="col-md-2">{{record.from}}</div>
      <div class="col-md-3" ng-show="editItem == false" ng-hide="editItem">{{record.destination}}</div>
      <div class="col-md-3" ng-show="editItem == true" ng-hide="!editItem">
        <select class="form-control" ng-model="record.destination" ng-options="location.place as location.place for location in locationlist | orderBy:'place'">
          <option value="">Destination</option>
        </select> 
      </div>
      <div class="col-md-1 msf-centered" ng-show="editItem == false" ng-hide="editItem">{{record.pax}}</div>
      <div class="col-md-1" ng-show="editItem == true" ng-hide="!editItem">
        <select class="form-control" ng-model="record.pax">
            <option>Driver</option>
            <option>1</option>
            <option>2</option>
            <option>3</option>
            <option>4</option>
            <option>5</option>
            <option>6</option>
            <option>7</option>
            <option>8</option>
            <option>9</option>
            <option>10</option>
          </select>
      </div>

And the current filter: 和当前的过滤器:

    <div class="col-md-12 msf-filter">
        <div class="row">
          <form role="form">
            <div class="col-md-1 msf-date">
              <input class="form-control" placeholder="Time" ng-model="search.time">
            </div>
            <div class="form-group col-md-1">
              <input class="form-control" placeholder="Car" ng-model="search.car">
            </div>
            <div class="form-group col-md-2">
              <input class="form-control" placeholder="Driver" ng-model="search.driver">
            </div>
            <div class="form-group col-md-2">
              <input class="form-control" placeholder="From" ng-model="search.from">
            </div>
            <div class="form-group col-md-3">
              <input class="form-control" placeholder="Destination" ng-model="search.destination">
            </div>
            <div class="form-group col-md-1">
              <input class="form-control" placeholder="Pax" ng-model="search.pax">
            </div>
            <div class="form-group col-md-1">
              <input type="checkbox" ng-model="search.cancelled"> Cancelled 
            </div>

          </form>
        </div>
      </div>

So far, when I check the checkbox, it will filter the results correctly, but when I uncheck, it will display no results at all (when it should be displaying all of them). 到目前为止,当我选中该复选框时,它将正确过滤结果,但是当我取消选中时,它将根本不显示任何结果(当应该显示所有结果时)。

What am I missing? 我想念什么?

The problem you are facing is the following: 您面临的问题如下:

  1. At first search.cancelled is undefined . 最初search.cancelledundefined
  2. When you click the checkbox the first time, the value changes to true . 第一次单击该复选框时,该值将更改为true
  3. If you click again the value will change to false , so the filter searchs for elements where record.cancelled == false . 如果再次单击,该值将变为false ,因此过滤器将在record.cancelled == false位置搜索元素。

One way to get around this problem is to use the ng-change attribute for the checkbox element like this: 解决此问题的一种方法是对复选框元素使用ng-change属性,如下所示:

ng-change="search.cancelled = search.cancelled ? true : undefined"

In the HTML: 在HTML中:

<input type="checkbox" ng-model="search.cancelled" ng-change="search.cancelled = search.cancelled ? true : undefined">


Check out this DEMO 看看这个演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM