35

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

4

2 回答 2

83

我更喜欢实现装饰器模式,这在 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;
  }])
}])

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

<p>Standard output : {{ now | date:'yyyyMMddhhmmss' }}</p>
<p>External behavior : {{ now | date:'yyyyMMddhhmmss': ' My suffix' }}</p>

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

于 2014-09-21T05:17:43.137 回答
45

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

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

然后,在您的模板中:

{{now | customDate}}

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

{{now | date:'yyyyMMddhhmmss'}}

这是说明这两种技术的工作 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中的“自定义验证”部分)。

于 2012-09-02T15:31:55.510 回答