【问题标题】:how to use filter on button click in angular js如何在angular js中的按钮单击上使用过滤器
【发布时间】:2023-03-27 14:05:01
【问题描述】:

你能告诉我如何在按钮单击时按升序或降序对数组进行排序。实际上我在标题“V”上有一个按钮。使用按钮单击我想按升序显示数据。实际上我正在制作一个网格使用角度 js 在 Ionic 中查看。但我想使用按钮单击对其进行排序。我需要根据第一列对表进行排序。因为用户单击第一列“V”。

这是我的代码

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

按钮点击后的预期结果

Calls   Royal Dutch sell

p        a royal data

Xgtyu     test royal data

我们可以对列进行排序并在按钮单击时显示在视图上吗?

  <div class="row gray-20 mrginrightleft">
    <div class="col col-center " ng-repeat="d in data | filter:{checked: true}"><i class="button button-icon icon ion-arrow-down-b" ng-click="sortdata()"></i><strong>{{d.label}}</strong></div>
    <div class="col col-10 text-center ">
      <button class=" button-icon icon ion-gear-b" ng-click="openPopover($event)"></button>
    </div>
  </div>
  <div class="row mrginrightleft" ng-repeat="column in displayData | filter: query">
    <div class="col col-center brd" ng-repeat="field in column.columns" ng-show="data[$index].checked && data[$index].fieldNameOrPath===field.fieldNameOrPath">{{field.value}}</div>
    <div class="col col-10 text-center brd">
    </div>
  </div>

【问题讨论】:

    标签: angularjs angularjs-directive angularjs-scope angularjs-ng-repeat ionic-framework


    【解决方案1】:

    如果您的 data 是一个数组,那么您可以使用 orderBy 过滤器 在此处查看官方文档:https://docs.angularjs.org/api/ng/filter/orderBy

    【讨论】:

    • 是的,我从这个链接知道这一点,但我有嵌套数组请检查我的 plunker ..请检查这个 displayData 对象
    • 实际上我是通过使用两个对象数据和 displayData 来显示数据。这就是为什么我要对我的列进行排序
    • @aorfeve 你有什么想法吗。可以另一个数组并填充所有列数据
    • 如果您不知道答案,请删除此答案,因为它不是正确答案
    【解决方案2】:

    编辑:对两个方向进行排序

    Updated Plunker

    为了能够双向排序,您可能应该使用指令。使用指令将允许您为每个标题创建一个独立的范围,这样他们就可以跟踪自己的当前值。

    .directive('sortHeader', function($timeout) {
      return {
        restrict: 'E',
        scope: {
          'label': '@',
          'sortstring': '&sortExp',
          'idx': '@index'
        },
        templateUrl: 'sort-header.html',
        link: function(scope, element, attrs) {
          scope.reverse = false;
          element.on('click', function(){
            $timeout(function(){
              scope.reverse = !scope.reverse;
            });
          });
        }
      };
    });
    

    该指令具有以下属性:

    1. label [string] 列标题名称。
    2. index [string] 原始数据集中的列索引。请注意,您不能使用 ng-repeat 的 $index。
    3. sort-exp [method] 这是一个可绑定的方法,您可以使用它来检索当前索引并反转值来设置您的 orderBy 过滤器表达式。该函数按此顺序传递两个值:idx, reverse。这些将当前元素的索引和反向顺序表示为 boolean

    你使用指令如下:

    <sort-header label="{{d.label}}" index="{{d.index}}" sort-exp="setSort(idx, reverse)"></sort-header>
    

    并且,在您的控制器中,您可以使用函数绑定到 sort-exp:

    $scope.setSort = function(idx, reverse){
      $scope.sortval = 'columns['+idx+'].value';
      $scope.reverse = reverse;
    };
    

    最后,在您的 ng-repeat 中,您可以使用用于定义排序表达式(在本例中为 $scope.sortval)和排序顺序(在本例中为 $scope.反向):

    ng-repeat="column in displayData | orderBy: sortval:reverse | filter: query"
    

    【讨论】:

    • 嗨,先生,我有一个问题..我们可以在单击同一按钮时在“升序”和“降序”之间切换吗?换句话说,在单击按钮时,我们按升序显示。现在我需要在同一个按钮单击时按降序显示
    • 我更新了 Plunker 和我的答案。我之前的方法有一个重大错误,那就是我依赖于 ng-repeat 的 $index 值。当然,当您有隐藏列时,这是有缺陷的,因为重复中列的索引将与您的 displayData 中相应对象的索引不匹配。我通过转换数据对象为每个对象添加一个固定的索引属性来解决这个问题。
    • 你能看看我的最后一个问题stackoverflow.com/questions/30647801/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多