Come estendere o sovrascrivere i filtri esistenti in angularjs?

È ansible estendere i filtri “standard” esistenti ( date , number , lettere lowercase , ecc.)? Nel mio caso ho bisogno di analizzare la data dal formato YYYYMMDDhhmmss, quindi vorrei estendere (o sovrascrivere) il filtro date invece di scrivere il mio.

Non sono sicuro di aver compreso correttamente la tua domanda, ma se desideri estendere la funzionalità dei filtri esistenti puoi creare un nuovo filtro che ne decori uno esistente. Esempio:

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

e poi, nel tuo modello:

 {{now | customDate}} 

Detto questo, se si desidera semplicemente formattare una data in base a un determinato formato, è ansible farlo con il filtro data esistente:

 {{now | date:'yyyyMMddhhmmss'}} 

Ecco il jsFiddle funzionante che illustra entrambe le tecniche: http://jsfiddle.net/pkozlowski_opensource/zVdJd/2/

Si noti che se non si specifica un formato AngularJS presumerà che questo sia formato “medio” (il formato esatto dipende da una locale). Controlla http://docs.angularjs.org/api/ng.filter:date per ulteriori informazioni.

L’ultima osservazione: sono un po ‘confuso riguardo alla parte “parse from” della tua domanda. Il fatto è che i filtri sono utilizzati per analizzare un object (data in questo caso) per la stringa e non viceversa. Se stai cercando di analizzare le stringhe (da un input) che rappresentano le date dovresti esaminare i parser NgModelController # $ (controlla la parte “Convalida personalizzata” in http://docs.angularjs.org/guide/forms ).

Preferisco implementare il modello decoratore , e in realtà in angular è molto facile ..
Quindi, se prendiamo l’esempio @ pkozlowski.opensource, puoi fare qualcosa del genere:

  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; }]) }]) 

E poi nelle tue visualizzazioni, puoi usare entrambi .. lo standard output e il comportamento esteso.
con lo stesso filtro

 

Standard output : {{ now | date:'yyyyMMddhhmmss' }}

External behavior : {{ now | date:'yyyyMMddhhmmss': ' My suffix' }}

Ecco il jsFiddle funzionante che illustra entrambe le tecniche: http://jsfiddle.net/ar8m/9dg0hLho/