2014-07-21 10 views
16

Mam obiektów tak:niestandardowe zamówienie używając orderby w NG-repeat

students = {name: 'Aa_Student', class: 'A_Class'}, 
      {name: 'Ab_Student', class: 'A_Class'}, 
      {name: 'Ac_Student', class: 'B_Class'}, 
      {name: 'Ba_Student', class: 'B_Class'}, 
      {name: 'Bb_Student', class: 'C_Class'}, 
      {name: 'Bc_Student', class: 'C_Class'} 

Powiedzmy studenci obiekt jest tasuje. Używam ng-repeat, aby pokazać dane. Chcę posortować obiekty w niestandardowej kolejności.

Na przykład, chcę pokazać dane jak poniżej:

Name    Class 
----------------------------- 
Ac_Student   B_Class 
Ba_Student   B_Class 
Aa_Student   A_Class 
Ab_Student   A_Class 
Bb_Student   C_Class 
Bc_Student   C_Class 

Więc zasadniczo Chcę zamówić przez ucznia klasy, ale B_Class przychodzi, potem A_Class, potem C_Class. Chcę również zamówić nazwę ucznia w kolejności alfabetycznej. Jak mogę to zrobić?

HTML:

<table> 
    <tr ng-repeat="student in students | orderBy:customOrder"> 
    ... 
    </tr> 
</table> 

Kontroler:

$scope.customOrder = function(student) { 
    $scope.students = $filter('orderBy')(student, function() { 

    }); 
}; 
+1

Istnieją dwa sposoby, aby zrobić (1) Dostosuj filtr (2) Krótki dane na poziomie kontrolera – dhavalcengg

+0

@dhavalcengg Więc muszę użyć filtra? –

+1

Uważaj na literówkę w '$ scope.studens' (brak t) – Gamb

Odpowiedz

19

Hi można tworzyć niestandardowe sortowania filtrować można znaleźć tutaj http://jsbin.com/lizesuli/1/edit

html:

<p ng-repeat="s in students |customSorter:'class'">{{s.name}} - {{s.class}} </p> 
     </div> 

filtr angularjs:

app.filter('customSorter', function() { 

    function CustomOrder(item) { 
    switch(item) { 
     case 'A_Class': 
     return 2; 

     case 'B_Class': 
     return 1; 

     case 'C_Class': 
     return 3; 
    } 
    } 

    return function(items, field) { 
    var filtered = []; 
    angular.forEach(items, function(item) { 
     filtered.push(item); 
    }); 
    filtered.sort(function (a, b) {  
     return (CustomOrder(a.class) > CustomOrder(b.class) ? 1 : -1); 
    }); 
    return filtered; 
    }; 
}); 
+1

To jest dokładnie to, czego szukałem. Dzięki. –

+2

Witaj, 'kątowy dla każdego elementu (elementy, funkcja (element); });' ten kod wydaje mi się niepotrzebny, nie wystarczy powiedzieć 'var filters = items;' – codtex

-1

ustawić orderBy jako własność obiektów tylko zacytować, że nazwa właściwości w znacznikach:

ng-repeat="student in students |orderBy:'name' | orderBy:'class'" 

DEMO

+0

Dzięki, ale chcę zamówić B_Class jako pierwszy. To nie jest kolejność alfabetyczna. –

10

że to jest stary, ale może się przydać do inne ...

Można również utworzyć prostą funkcję sortowania niestandardowego. "Nie dość filtr":

$scope.customOrder = function (item) { 
     switch (item) { 
      case 'A_Class': 
       return 2; 

      case 'B_Class': 
       return 1; 

      case 'C_Class': 
       return 3; 
     } 
    }; 

a następnie użyć jakbyś chciał:

<table> 
<tr ng-repeat="student in students | orderBy:customOrder"> 
... 
</tr> 

Powiązane problemy