【问题标题】:How to conditionally apply Angular filters on ng-repeat of object attributes?如何有条件地对对象属性的 ng-repeat 应用 Angular 过滤器?
【发布时间】:2016-07-08 02:50:06
【问题描述】:

我有一个具有 100 多个属性的对象,例如“名称”、“价格”、“到期日”...等 我正在使用 ng-repeat 遍历对象的所有密钥对值并将它们显示在表格上。

<table class="table">
    <tr ng-repeat="x in attr_array">
        <td><b>{{x.key}}</b></td>
        <td>{{x.value}}</td>
    </tr>
</table>

但我想对某些属性使用 Angular 日期过滤器,例如任何日期字段:

{{ x.value | date: 'MMM d, y'}}

理想情况下还有其他过滤器。我该怎么做?

【问题讨论】:

  • 也许使用 ng-if="x.value instanceof Date" 作为 td 元素的属性。并为每种数据类型重复
  • 理想情况下我想应用多个过滤器
  • @sniels 不使用ng-if 意味着评估为FALSE&lt;td&gt; 元素不会显示?我仍然希望显示我的所有 &lt;td&gt; 元素,但对其中一些元素应用过滤器。

标签: angularjs angularjs-ng-repeat conditional angular-filters


【解决方案1】:

我尝试重现您的问题并通过ng-if 解决了它。 角度命名空间中似乎有一个函数可以检查我通过范围注入到视图中的每种类型,如日期、字符串、数字。
另请注意,我使用ng-repeat="(key, value) in ..." 假设您正在迭代一个对象source

<!DOCTYPE html>
<html>

<head>
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>

<body ng-app="app" ng-controller="RootController">
  <table>
    <tr ng-repeat="(key, value) in attr_array">
      <td><b>{{key}}</b>
      </td>
      <td>
        <span ng-if="isDate(value)">{{value | date: 'MMM d, y'}}</span>
        <span ng-if="isNumber(value)">{{value | number: 4}}</span>
        <span ng-if="isString(value)">{{value | uppercase}}</span>
      </td>
    </tr>
  </table>
  <script>
    angular.module('app', [])
      .controller('RootController', function($scope) {
        $scope.isDate = angular.isDate;
        $scope.isNumber = angular.isNumber;
        $scope.isString = angular.isString;
        $scope.attr_array = {
          date: new Date(),
          str: "hello",
          nm: 50.2
        };
      });
  </script>
</body>

</html>

【讨论】:

    【解决方案2】:

    这不是简单而优雅的方法。您不能拥有动态过滤器,因此您的选择优先于次要顺序:

    • 在控制器中动态预格式化日期字段
    • 使用 ngIf/ngShow 开关
    • 编写自定义过滤器,该过滤器将根据某些配置应用另一个过滤器。

    这是自定义过滤器方法的示例:

    angular.module('demo', [])
    
    .controller('MainCtrl', function($scope) {
      $scope.attr_array = [
        {key: 'created', value: new Date, filter: ['date', 'MMM d, y']},
        {key: 'name', value: 'Thomas Mann', filter: 'uppercase'},
        {key: 'price', value: 1233.45, filter: 'number'},
        {key: 'description', value: 'Some long string', filter: ['limitTo', 10] }
      ]
    })
    
    .filter('transform', function($filter) {
      return function(value, filter) {
        var filterData = [].concat(filter);
        filterData.splice(1, 0, value);
        return $filter(filterData.shift()).apply(this, filterData);
      }
    })
    <script src="https://code.angularjs.org/1.4.9/angular.js"></script>
    
    <table ng-app="demo" ng-controller="MainCtrl" class="table">
      <tr ng-repeat="x in attr_array">
        <td><b>{{ x.key }}</b>
        </td>
        <td>{{ x.value | transform:x.filter }}</td>
      </tr>
    </table>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      相关资源
      最近更新 更多