既存の「標準」フィルター(、、など)を拡張することは可能date
ですnumber
かlowercase
?date
私の場合、YYYYMMDDhhmmss形式から日付を解析する必要があるため、独自の形式を作成するのではなく、フィルターを拡張(またはオーバーライド)したいと思います。
2 に答える
私は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/
あなたの質問を正しく理解しているかどうかはわかりませんが、既存のフィルターの機能を拡張したい場合は、既存のフィルターを装飾する新しいフィルターを作成できます。例:
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」の部分を確認してください)。