使用 ng-repeat 有条件地应用过滤器

Posted

技术标签:

【中文标题】使用 ng-repeat 有条件地应用过滤器【英文标题】:Conditionally apply filters with ng-repeat 【发布时间】:2013-06-16 20:42:04 【问题描述】:

我有一个对象,其中包含值的数字和文本的混合。当对象的值是数字时(显然),我想将 numbers 过滤器应用于对象的值。但是当它不是一个数字时,我会接受它只是吐出字符串。照原样,将| number 应用于值会格式化数字,但会将字符串值留空(毕竟,它们不是数字)。

我猜它必须是一个自定义过滤器(我还需要制作)。在执行ng-repeat 时,有没有办法仅在 html 中执行此操作?

<table>
      <tr ng-repeat="(metric, metricData) in data">
        <td>metric</td>
        <td>metricData | number</td>
      </tr>
</table>

$scope.data =  name:"this is the name", 
                score:48
                outcome:"as expected",
                attendance:820,
                total:212.34
              ;

【问题讨论】:

您知道,客户过滤器不是一个坏方法...... 我想不是。我只是还没学会怎么做。也许是我学习的时候了。哈。 【参考方案1】:

我知道这很旧,但我认为最好的解决方案是将逻辑移至过滤器。

app.filter("metricDataFilter", function($filter) 
    return function(value) 
      if(angular.isNumber(value)) 
          return $filter("number", value);  
      

      return value;
      

这样 HTML 更简洁,Angular 不用重绘 dom 元素

<table>
    <tr ng-repeat="(metric, metricData) in data">
        <td>metric</td>
        <td>metricData | metricDataFilter</td>
    </tr>
</table>

【讨论】:

【参考方案2】:

这是@callmekatootie 使用ng-if (v1.1.5) 要求的答案的替代版本:

<table>
    <tr ng-repeat="(metric, metricData) in data">
        <td>metric</td>
        <td ng-if="isNumber(metricData)">metricData | number</td>
        <td ng-if="!isNumber(metricData)">metricData</td>
    </tr>
</table>

这具有仅对数字元素运行过滤器的优点。在这种情况下,这可能没什么好处,但在其他更复杂的过滤器情况下可能很有用。为了回答您关于内置 angular.isNumber 的其他问题,@callmekatootie 确实在范围函数 isNumber 中使用了它,这只是在视图中使用内置函数的包装器。

Here is a fiddle

【讨论】:

我认为OP也想知道内置函数angular.isNumber()是否可以直接在HTML代码中使用,我认为这是不可能的。对吗? @callmekatootie 我想是的,表达式似乎只支持作用域上的变量。【参考方案3】:

您可以这样尝试 - 在您的控制器中,您可以有一个函数来识别提供的值是字符串还是数字:

$scope.isNumber = function (value) 
    return angular.isNumber(value);
;

接下来,在您看来,您可以拥有以下内容:

<table>
    <tr ng-repeat="(metric, metricData) in data">
        <td>metric</td>
        <td ng-show="isNumber(metricData)">metricData | number</td>
        <td ng-hide="isNumber(metricData)">metricData</td>
    </tr>
</table>

因此,当metricData为数字时,将其过滤,当为字符串时,则按原样输出。

【讨论】:

+1 变体可以使用ng-if (v. 1.1.5+),因此在关闭的情况下根本不会过滤数据集(这可以节省大型数据集/复杂的时间过滤器)。 我喜欢这个解决方案。 Angular 没有内置的 isNumber 指令吗? angular.isNumber?我尝试将其用于其他用途,但无法在 HTML 中使用。 @sh0ber 使用ng-if 的正确语法是什么?我刚刚将我的角度版本升级到 1.1.5。但我没有找到任何关于使用该指令的文档。刚刚被告知“像 ng-switch 一样使用它”...您愿意使用 nf-if 提交解决方案吗?谢谢。 我认为在 上显示/隐藏可能会导致问题...最好使用 ng-if / ui-if

以上是关于使用 ng-repeat 有条件地应用过滤器的主要内容,如果未能解决你的问题,请参考以下文章

使用 ng-repeat 和过滤器时数组中对象的 $index

在 ng-repeat 中动态应用格式化过滤器

Angular js - 如果 ng-repeat 为空则显示消息

ng-repeat过滤器,在过滤器删除了对象时显示消息

嵌套 ng-repeat 的 AngularJS 记录计数

用于未定义属性的 ng-repeat 过滤器