2012-09-02 17 views

Respuesta

41

No estoy seguro si entiendo su pregunta correctamente, pero si desea ampliar la funcionalidad de los filtros existentes, podría crear un nuevo filtro que decore uno existente. Ejemplo:

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

y luego, en su plantilla:

{{now | customDate}} 

Una vez dicho lo anterior, si simplemente desea dar formato a una fecha de acuerdo con un formato determinado esto se puede hacer con el filtro de la fecha actual :

{{now | date:'yyyyMMddhhmmss'}} 

Aquí es el jsFiddle de trabajo que ilustra las dos técnicas: http://jsfiddle.net/pkozlowski_opensource/zVdJd/2/

Tenga en cuenta que si no se especifica un formato, AngularJS supondrá que se trata de un formato "medio" (el formato exacto depende de una configuración regional). Compruebe http://docs.angularjs.org/api/ng.filter:date para más.

La última observación: Estoy un poco confundido acerca de la parte de la pregunta 'analizar'. Lo que ocurre es que los filtros se utilizan para analizar un objeto (fecha en este caso) en cadena y no viceversa. Si busca después de analizar cadenas (desde una entrada) que representan fechas, debería buscar en NgModelController # $ analizadores (consulte la parte "Validación personalizada" en http://docs.angularjs.org/guide/forms).

+3

De acuerdo con la documentación actualizada del filtro puede aceptar fechas como ISO 8601 cuerdas formateados. En mi caso, el formato de entrada es 'aaaaMMddHHmmss' para que el filtro estándar 'date' no pueda analizarlo. – coxx

69

prefiero para implementar el decorator pattern, y de hecho en angular es muy fácil ..
Así, si tomamos @ pkozlowski.opensource ejemplo, se puede hacer algo así:

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

Y luego En sus puntos de vista, puede usar ambos ... el resultado estándar y el comportamiento extendido.
con el mismo filtro

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

Aquí es el jsFiddle trabajo ilustrando las dos técnicas: http://jsfiddle.net/ar8m/9dg0hLho/

+5

Esto es absolutamente 100% exactamente lo que necesitaba. Si pudiera, te votaría tres veces. –

+1

Esta es la respuesta correcta. Pero recuerda que tienes que agregar '' 'Filter''' para filtros para obtenerlos. Volver a crear un filtro con el mismo nombre también está bien para mí, ya que generalmente (¿siempre?) Es una función única, vas a cambiar de cualquier forma. –

+0

Gran enfoque. q: el primer parametro de 'srcFilter.apply (...)' es 'this', sin embargo, vi otros ejemplos de que el primer param es' null'. ¿Cuál es su propósito? –

Cuestiones relacionadas