2012-09-02 5 views

Odpowiedz

41

Nie jestem pewien, czy dobrze rozumiem twoje pytanie, ale jeśli chciałbyś rozszerzyć funkcjonalność istniejących filtrów, możesz stworzyć nowy filtr, który zdobi istniejący. Przykład:

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

a następnie w szablonie:

{{now | customDate}} 

Mimo powyższego, jeśli po prostu chcesz sformatować datę stosownie do danego formatu można to zrobić z istniejącym filtrem data :

{{now | date:'yyyyMMddhhmmss'}} 

Oto jsFiddle ilustrujący pracę obu technik: http://jsfiddle.net/pkozlowski_opensource/zVdJd/2/

Należy pamiętać, że jeśli format nie jest określony, AngularJS zakłada, że ​​jest to format "średni" (dokładny format zależy od ustawień regionalnych). Sprawdź numer http://docs.angularjs.org/api/ng.filter:date, aby uzyskać więcej informacji.

Ostatnia uwaga: jestem nieco zdezorientowany, jeśli chodzi o "parsowanie" części pytania. Rzecz w tym, że filtry służą do analizowania obiektu (w tym przypadku daty), a nie wersetu. Jeśli analizowane są ciągi (z danych wejściowych) reprezentujących daty, należy zajrzeć do parserów $ NgModelController # (sprawdź część "Custom Validation" w http://docs.angularjs.org/guide/forms).

+3

według daty dokumentacja filtra może przyjąć termin jak ISO 8601 sformatowane ciągów. W moim przypadku format wejściowy to "yyyyMMddHHmmss", więc standardowy filtr 'date' nie może go przeanalizować. – coxx

69

wolę wdrożenia decorator pattern, a właściwie w kątowa jest bardzo proste ..
Tak więc, jeśli weźmiemy @ pkozlowski.opensource przykład, można zrobić coś takiego:

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

a następnie w swoich widokach możesz używać zarówno standardowych, jak i rozszerzonych zachowań.
z tym samym filtrem

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

Oto jsFiddle ilustrujący pracę obu technik: http://jsfiddle.net/ar8m/9dg0hLho/

+5

To jest absolutnie w 100% dokładnie to, czego potrzebowałem. Wezmę głos, trzy razy, jeśli zdołam. –

+1

To jest poprawna odpowiedź. Pamiętaj jednak, że aby je pobrać, musisz dodać "Filtr". Odtworzenie filtru o tej samej nazwie jest również w porządku, ponieważ zazwyczaj (zawsze?) Jest to jedna funkcja, którą zamierzacie zmienić w dowolny sposób. –

+0

Świetne podejście. q: pierwszy parametr 'srcFilter.apply (...)' jest 'tym', jednak widziałem inne przykłady, że pierwszym parametrem jest 'null'. jaki jest cel? –