14

我想修改currency过滤器以处理输入值中的自定义货币格式。

(例如,AUD 3.00 -> $3.00)。

一种选择是从头开始编写我自己的过滤器。然而,这似乎有很多重复,鉴于现有的过滤器很棒,我只需要先修剪前面的几个字符。

理想情况下,我会有这样的事情:

.filter('money', function($filters) {
    return function(text){
        var currency = text.substring(4)
        return $filters('currency')(currency)
    };
});

是否可以:

  • 从另一个过滤器调用一个过滤器?
  • 访问内部方法(例如,此处formatNumber()显示

为此,我还有哪些其他选择?

4

3 回答 3

29
  • 从另一个过滤器调用一个过滤器?

是的,我发现的最佳解决方案是创建一个新过滤器:

angular.module('ui.filters').filter('customCurrency',
    [ '$filter', function(filter) {
      var currencyFilter = filter('currency');
      return function(amount, currencySymbol) {
        return currencyFilter(amount.substr(4), currencySymbol);
      }
    } ]);

这会将诸如“ AUD 30.00 ”之类的值转换为“ $30.00

根据我的尝试,从 1.0.1 版开始,您不能覆盖过滤器。我尝试使用相同的名称创建过滤器并尝试引用原始过滤器会导致无限循环。

是一个很好的考虑点:

但是,我建议不要这样做——即使这是允许的。预定义过滤器是 AngularJS 的公共 API。如果 AngularJS 的某些部分在内部使用其中的一些,或者有一天您安装了一些依赖于该过滤器的附加组件怎么办?

另请参阅,即使我相信 op 并不真正需要自定义过滤器,也基本相同的结论。

  • 访问内部方法(例如,formatNumber())?

如果该功能没有公开,那么作者认为它不是他们想要提供的公共 api。作者可能有一个特定的实现特定功能,可能不会马上显而易见。

PS:该模块是您需要过滤器的任何内容。我在不同的模块中分离了一些功能,并在构建主模块时需要它们

var App = angular.module('App', [ 'ui' ]);
于 2012-11-09T13:06:04.830 回答
1

最好的方法是,

<div> {{amount | currency:'$'}} </div>

在你的 html 中。这将自动撕掉与货币类型相对应的前几个字符,并将它们替换为您传递的字符串参数“$”。

于 2015-02-09T06:22:18.357 回答
0

Angular 的货币过滤器允许您使用语言环境服务中的默认货币符号,或者您可以为过滤器提供自定义货币符号。如果您的应用仅在一种语言环境中使用,则可以使用默认货币符号。但是,如果您预计其他地区的观众可能会使用您的应用,您应该提供自己的货币符号以确保理解实际价值。

例如,如果您想显示 1000 美元的帐户余额,并使用以下包含货币过滤器的绑定:{{ 1000 | currency }},并且您的应用当前位于 en-US 语言环境中。将显示“$1000.00”。但是,如果其他本地(例如日本)的人查看您的应用程序,她的浏览器会将语言环境指定为 ja,而将显示余额 '¥1000.00'。这真的会让你的客户感到不安。

在这种情况下,您需要通过在配置过滤器时为货币过滤器提供货币符号作为参数来覆盖默认货币符号,例如 USD$1,000.00。这样,Angular 将始终显示“1000 美元”的余额并忽略任何区域设置更改。

请参阅本地化说明: http: //docs.angularjs.org/guide/i18n

于 2012-11-09T16:40:06.780 回答