2013-06-20 12 views
8

Mam obiekt zawierający mieszaninę liczb i tekstu dla wartości. Chciałbym zastosować filtr numbers do wartości obiektu, gdy jest to liczba (oczywiście). Ale kiedy nie jest to liczba, nie miałbym nic przeciwko temu, gdybym wypluł strunę. Tak jak jest, zastosowanie | number do wartości formatuje liczby, ale pozostawia wartości łańcuchowe puste (poza tym nie są liczbami).Warunkowo zastosuj filtry z powtórzeniem ng

Zgaduję, że musi to być niestandardowy filtr (który mam jeszcze do zrobienia). Czy istnieje sposób, aby zrobić to wyłącznie w HTML podczas wykonywania ng-repeat?

<table> 
     <tr ng-repeat="(metric, metricData) in data"> 
     <td>{{metric}}</td> 
     <td>{{metricData | number}}</td> 
     </tr> 
</table> 

$scope.data = { name:"this is the name", 
       score:48 
       outcome:"as expected", 
       attendance:820, 
       total:212.34 
       }; 
+2

Tak wiesz, filtr klient nie jest zły sposób to zrobić ... – callmekatootie

+0

Wyobrażam sobie, że tak nie jest. Po prostu nie nauczyłem się jeszcze tego robić. Może czas, abym się uczył. ha. – EnigmaRM

Odpowiedz

18

Oto wniosek alternatywna wersja odpowiedzi z @callmekatootie użyciu ng-if (v1.1.5):

<table> 
    <tr ng-repeat="(metric, metricData) in data"> 
     <td>{{metric}}</td> 
     <td ng-if="isNumber(metricData)">{{metricData | number}}</td> 
     <td ng-if="!isNumber(metricData)">{{metricData}}</td> 
    </tr> 
</table> 

Ma to tę zaletę, że działa tylko filtr na elementach, które są numeryczne. Jest to prawdopodobnie mało korzystne w tym przypadku, ale może być przydatne w innych, bardziej złożonych sytuacjach filtrowania. Aby odpowiedzieć na inne pytanie dotyczące wbudowanego angular.isNumber, @callmekatootie korzysta z tego w funkcji zakresu isNumber, która jest tylko opakowaniem do korzystania z wbudowanego w widoku.

Here is a fiddle

+1

Myślę, że również OP chciał wiedzieć, czy w wbudowanej funkcji 'angular.isNumber()' może być używany bezpośrednio wewnątrz HTML kod, który moim zdaniem nie jest możliwy. Poprawny? – callmekatootie

+0

@callmekatootie Wydaje mi się, że wyrażenia wydają się obsługiwać tylko zmienne w zakresie. – sh0ber

3

Można go spróbować w ten sposób - w kontrolerze, można mieć funkcję, która identyfikuje jeśli Podana wartość jest ciągiem znaków lub numer:

$scope.isNumber = function (value) { 
    return angular.isNumber(value); 
}; 

Następnie w widoku mogłeś są następujące:

<table> 
    <tr ng-repeat="(metric, metricData) in data"> 
     <td>{{metric}}</td> 
     <td ng-show="isNumber(metricData)">{{metricData | number}}</td> 
     <td ng-hide="isNumber(metricData)">{{metricData}}</td> 
    </tr> 
</table> 

tak więc, gdy metricData jest liczbą, odsącza się go, a jeżeli jest to łańcuch, jest wyprowadzany jako to.

+1

+1 Odmiana mogłaby używać 'ng-if' (w wersji 1.1.5+), więc zestaw danych nie jest w ogóle filtrowany w przypadku nietypowym (może to zaoszczędzić czas przy dużych zbiorach danych/złożonych filtrach). – sh0ber

+1

Podoba mi się to rozwiązanie. Czy kąt nie ma wbudowanej dyrektywy isNumber? 'angle.isNumber'? Próbowałem użyć tego do czegoś innego, ale nie mogłem go uruchomić w kodzie HTML. – EnigmaRM

+0

@ sh0ber jaka jest właściwa składnia użycia 'ng-if'? Właśnie zaktualizowałem swoją wersję kątową do wersji 1.1.5. Ale nie znajduję żadnej dokumentacji na temat stosowania tej dyrektywy. Po prostu powiedziano "użyj go jak ng-switch" ... Czy byłbyś skłonny złożyć rozwiązanie za pomocą nf-if? Dzięki. – EnigmaRM

3

wiem, że to jest stary, ale myślę, że najlepszym rozwiązaniem jest przeniesienie logiki do filtra.

app.filter("metricDataFilter", function($filter) { 
    return function(value) { 
     if(angular.isNumber(value)) { 
      return $filter("number", value); 
     } 

     return value; 
    } 
} 

ten sposób HTML jest bardziej zwięzły i kanciasty nie będzie musiał przerysować elementów DOM

<table> 
    <tr ng-repeat="(metric, metricData) in data"> 
     <td>{{metric}}</td> 
     <td>{{metricData | metricDataFilter}}</td> 
    </tr> 
</table> 
Powiązane problemy