2013-09-23 12 views

Odpowiedz

4

Brzmi jak dobre miejsce do użyć filtru:

<tr ng-repeat="text in data"> 
    <td>{{text|displayText}}</td> 
</tr> 
angular.module('myApp').filter('displayText', function() { 
    return function(text) { 
     return angular.isObject(text) ? 'IsObject' : text; 
    }; 
}); 
+1

Właściwie to złe miejsce na filtr. Nie jest to tym, na co przeznaczone są filtry i może prowadzić do poważnego kiepskiego kodu, jeśli będziesz nadal używać filtra w innym miejscu w podobny sposób. Lepszym sposobem byłoby użycie funkcji. –

+0

@TomBull dlaczego tak źle używać filtra w tym przypadku? – Zorgatone

+0

Zobacz komentarze w mojej odpowiedzi ... –

7

Proszę nie użyć filtra w tym przypadku, to wyraźnie miejsce dla funkcji w kontrolerze :

<tr ng-repeat="text in data"> 
    <td>{{isThisAnObject(text)}}</td> 
</tr> 

W kontrolerze:

$scope.isThisAnObject = function(input) { 
    return angular.isObject(input) ? 'IsObject' : input; 
}; 

Jest to nie tylko mniej kodu, ale działa również lepiej w wielu innych miejscach. Filtry mają bardzo konkretny cel. Nie to!

+5

Czy możesz wyjaśnić, dlaczego w tym przypadku funkcja jest lepsza niż filtr? Co to jest "bardzo konkretny cel" dla filtrów, który sprawia, że ​​są złym wyborem? –

+0

tak, chciałbym lepszego wyjaśnienia dla tego @TomBull – Zorgatone

+0

Filtr, jak sama nazwa wskazuje, jest przeznaczony do filtrowania. W szczególności filtrowanie tablic - tj. Ograniczanie elementów wyświetlanych na przykład w repeterze. Jest to (prawdopodobnie niezamierzony) efekt uboczny, że składnia działa również na pojedyncze elementy, jak w przyjętej odpowiedzi. Chociaż przedstawiona składnia działa dobrze w najprostszym przypadku - szybko staje się nieporządna. Na przykład, co się dzieje, gdy chcesz skomponować więcej niż jedną z tych operacji? Lub przetwarzać wyniki operacji w jakiś inny sposób? Lub użyć tej operacji w innym kontekście? –

Powiązane problemy