AngularJS:扩展内置过滤器

Mar*_*itt 13 angularjs

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

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

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

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

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

有可能:

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

还有哪些其他选择可供我使用?

Liv*_* T. 28

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

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

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

这会将" AUD 30.00 " 等值转换为" $ 30.00 "

从我试过的版本1.0.1开始,你不能覆盖过滤器.我尝试使用相同的名称创建一个过滤器,并尝试引用原始过滤器导致无限循环.

是一个值得考虑的优点:

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

,基本相同的结论,即使我相信运并不真的需要自定义过滤器.

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

如果该功能没有暴露,那么作者认为它不是他们想要提供的公共API.作者可能具有特定的实现特定功能,可能不会立即显而易见.

PS:模块是你需要过滤器的任何模块.我将不同模块中的一些功能分开,并在构建主模块时需要它们

var App = angular.module('App', [ 'ui' ]);
Run Code Online (Sandbox Code Playgroud)