【问题标题】:Angular filter not filtering correctly in version 1.3, is it better in version 1.5?Angular 过滤器在 1.3 版中无法正确过滤,在 1.5 版中是否更好?
【发布时间】:2016-04-15 04:48:38
【问题描述】:

我目前在我的控制器中使用内置的角度过滤器“$filter”来过滤数据的下拉列表,但过滤器根本没有正确过滤数据。它对其进行过滤,但过滤后的数据与输入的文本不匹配。我在读到,在 1.3 中,对象和数组的过滤器状态可能存在一些问题?我想知道这是版本问题还是我在代码中做错了什么?我正在考虑升级到 1.5,所以我只是好奇我的问题是否会在 1.5 中得到解决,或者我是否有语法错误。这是我所拥有的:

DATA(这是被 ng 重复的初始数据以及被过滤的内容:

this.items = [
            { name: 'Jim', city: 'Minneapolis', state: 'MN', zip: 44332 },
            { name: 'Boe', city: 'Scottsdale', state: 'AZ', zip: 44332 },
            { name: 'Tom', city: 'S.F.', state: 'CA', zip: 11223 },
            { name: 'Joe', city: 'Dallas', state: 'TX', zip: 34543 },
            { name: 'Jon', city: 'L.A.', state: 'CA', zip: 56433 },
        ];

模板:

  <input type="text" class="form-control" name="inputField" ng-change="ctrl.filterTextChangeLocal($event)" ng-model="ctrl.ngModelValue" ng-click="ctrl.openDropdown($event)" />

上面的输入过滤下面的列表:

  <ul class="dropdown-menu list-group" ng-if="!ctrl.ngDisabled">
    <li class="list-group-item" ng-repeat="row in ctrl.filteredItems"
    ng-mousedown="ctrl.onSelectedLocal(row, $event)">
        {{row[ctrl.itemDisplayProperty]}}
    </li>
    <li class="list-group-item text-center" ng-show="ctrl.filteredItems.length <= 0">
        {{ctrl.noResultsMessage}}
    </li>
</ul>

控制器:

     // filter the drodpown data
     //$event is being used to check for specific keypresses but doesn't matter here
     //ngModelValue is bound to ng-model inside the input

    public filterTextChangeLocal($event: ng.IAngularEvent) {
          this.filteredItems = this.$filter("filter")(this.items, this.ngModelValue);

    }

上面的结果是一个简单的 bootstrap ul 下拉列表,它会在列表中的对象上显示指定的属性,这里它会显示上面显示的数据中的 name 属性,但是这个数据没有被正确过滤:

 <li>Jim</li>
 <li>Boe</li>
 <li>Tom</li>
 <li>Joe</li>
 <li>Jon</li>

谢谢

【问题讨论】:

    标签: javascript angularjs angularjs-directive angularjs-ng-repeat angular-filters


    【解决方案1】:

    Angular 过滤器完美运行,问题可能出在您的实现中...这是您的工作示例:

    编辑:如果您想根据property 过滤数组,在您的情况下,您需要指示过滤器item in items | filter:{key:value}。 这是一个参考:How to filter by object property in angularJS

    function TestCtrl($scope, data) {
      var vm = $scope;
      
      vm.items = data;
      vm.query = '';
    }
    
    angular
      .module('test', [])
      .value('data', [
        { name: 'Jim', city: 'Minneapolis', state: 'MN', zip: 44332 },
        { name: 'Boe', city: 'Scottsdale', state: 'AZ', zip: 44332 },
        { name: 'Tom', city: 'S.F.', state: 'CA', zip: 11223 },
        { name: 'Joe', city: 'Dallas', state: 'TX', zip: 34543 },
        { name: 'Jon', city: 'L.A.', state: 'CA', zip: 56433 },
      ])
      .controller('TestCtrl', ['$scope', 'data', TestCtrl])
    ;
    @import "https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css";
    
    .form-group {
      padding-top: 1em;
      padding-bottom: 1.5em;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
    
    <section ng-app="test">
      <article ng-controller="TestCtrl">
        <div class="row form-group">
          <div class="col-xs-10 col-xs-offset-1">
            <input type="text" ng-model="query" class="form-control"/>
          </div>
        </div>
        
        <div class="data" ng-repeat="item in items | filter:{name: query} track by $index">
          
          <div class="media">
      <div class="media-left">
        <a href="#">
          <img class="media-object" src="..." alt="...">
        </a>
      </div>
      <div class="media-body">
        <h4 class="media-heading" ng-bind="item.name"></h4>
        <p>
          <span ng-bind="item.city"></span> - 
          <span ng-bind="item.state"></span> - 
          <span ng-bind="item.zip"></span>
        </p>
      </div>
    </div>
          
        </div>
      </article>
    </section>

    【讨论】:

    • 这似乎也没有正确过滤..如果我在输入中按“a”,我应该只得到其中带有“a”的名称,在这种情况下没有/跨度>
    • 因为它会过滤模型的每个属性。 a 字符出现在其他字段中,不仅在 name 中。看看我上次的编辑。
    • 是的,这就是我意识到的。我有过滤整个对象的功能,但更多地停留在显示的单个属性上。我想出了那部分。非常感谢您的宝贵时间。
    • 还有一个问题:如何使过滤器动态化,以便用户可以根据对象中显示的属性进行过滤,例如,如果用户传入 item-display-property="city " 然后下拉列表将显示我在帖子中拥有的对象中的所有城市。如果他们传入“状态”,它将过滤状态。但是组件的用户指定要传入的数据,所以他们可能有一个名为“地址”的属性,如果他们传入,我需要过滤器来过滤地址。
    • 这适用于静态过滤:this.filteredItems = this.$filter("filter")(this.items, {name : this.ngModelValue});但是当我尝试通过这样做使其动态化时: this.filteredItems = this.$filter("filter")(this.items, {this.itemDisplayProperty : this.ngModelValue});它没有运行,因为我不能在同一个对象中使用 'this' 两次
    【解决方案2】:

    你应该改变你的过滤器,比如 as-

    public filterTextChangeLocal($event: ng.IAngularEvent) {
              this.filteredItems = this.$filter("filter")(this.items, {'name':this.ngModelValue});
    
        }
    

    【讨论】:

    • 这似乎也没有正确过滤。如果我在输入中按“a”,下拉列表中不应该有任何名称,因为其中没有名称是“a”
    • 我收回了……当过滤的属性是“名称”或者如果我将其更改为“城市”时,它确实可以正确过滤。我怎样才能使这个价值动态化。由于这是一个组件,我不确定上面对象中的哪些属性将被过滤。根据指定要显示的属性来更新或更改“名称”值的最佳方法是什么。例如,我使用 this.itemDisplayProperty = "name" 或 this.itemDisplayProperty = "city" 来指定显示的属性在下拉列表中。非常感谢
    猜你喜欢
    • 2017-01-23
    • 2010-11-02
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多