如何扩展或覆盖angularjs中的现有过滤器?

cox*_*oxx 34 angularjs

是否有可能扩展现有的"标准"过滤器(date,number,lowercase等)?在我的情况下,我需要从YYYYMMDDhhmmss格式解析日期,所以我想扩展(或覆盖)date过滤器而不是自己编写.

a8m*_*a8m 82

我更喜欢实现装饰器模式,这在AngularJS中非常容易.
如果我们采用@ pkozlowski.opensource示例,我们可以将其更改为:

 myApp.config(['$provide', function($provide) {
  $provide.decorator('dateFilter', ['$delegate', function($delegate) {
    var srcFilter = $delegate;

    var extendsFilter = function() {
      var res = srcFilter.apply(this, arguments);
      return arguments[2] ? res + arguments[2] : res;
    }

    return extendsFilter;
  }])
}])
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以同时使用标准输出和扩展行为.
使用相同的过滤器

<p>Standard output : {{ now | date:'yyyyMMddhhmmss' }}</p>
<p>External behavior : {{ now | date:'yyyyMMddhhmmss': ' My suffix' }}</p>
Run Code Online (Sandbox Code Playgroud)

这是一个工作小提琴,说明了两种技术:http: //jsfiddle.net/ar8m/9dg0hLho/

  • 这绝对是我所需要的100%.如果可以的话,我会投票给你三次. (8认同)
  • 这是正确的答案.但请记住,你必须为过滤器附加```Filter```来获取它们.重新创建一个具有相同名称的过滤器对我来说也很好,因为它们通常(总是?)是一个单一的功能,你将以任何方式改变. (3认同)

pko*_*rce 43

我不确定我是否正确理解您的问题,但如果您想扩展现有过滤器的功能,您可以创建一个装饰现有过滤器的新过滤器.例:

myApp.filter('customDate', function($filter) {
    var standardDateFilterFn = $filter('date');
    return function(dateToFormat) {
     return 'prefix ' + standardDateFilterFn(dateToFormat, 'yyyyMMddhhmmss');
    };
});
Run Code Online (Sandbox Code Playgroud)

然后,在您的模板中:

{{now | customDate}}
Run Code Online (Sandbox Code Playgroud)

如上所述,如果您只是想根据给定的格式设置日期格式,可以使用现有的日期过滤器来完成:

{{now | date:'yyyyMMddhhmmss'}}
Run Code Online (Sandbox Code Playgroud)

这是工作jsFiddle说明这两种技术:http://jsfiddle.net/pkozlowski_opensource/zVdJd/2/

请注意,如果未指定格式,AngularJS将假定这是"中等"格式(具体格式取决于区域设置).查看http://docs.angularjs.org/api/ng.filter:date了解更多信息.

最后一句话:我对你问题的'解析'部分感到有些困惑.问题是过滤器用于将对象(在本例中为日期)解析为字符串而不是反之.如果您正在解析表示日期的字符串(来自输入),则必须查看NgModelController#$ parsers(请查看http://docs.angularjs.org/guide/forms中的"自定义验证"部分).

  • 根据文档日期过滤器可以接受日期为ISO 8601格式化字符串.在我的情况下,输入格式为'yyyyMMddHHmmss',因此标准过滤器`date`无法解析它. (3认同)