35

既存の「標準」フィルター(、、など)を拡張することは可能dateですnumberlowercasedate私の場合、YYYYMMDDhhmmss形式から日付を解析する必要があるため、独自の形式を作成するのではなく、フィルターを拡張(またはオーバーライド)したいと思います。

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#$ parserを調べる必要があります(http://docs.angularjs.org/guide/formsの「CustomValidation」の部分を確認してください)。

于 2012-09-02T15:31:55.510 に答える