2014-07-21 15 views
16

Ho oggetti come questo:ordine su ordinazione utilizzando orderBy in 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'} 

Diciamo che gli studenti oggetto viene mescolate. Io uso ng-repeat per mostrare i dati. Voglio ordinare gli oggetti nell'ordine personalizzato.

Per esempio, voglio mostrare i dati in questo modo:

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 

Quindi, fondamentalmente, voglio ordinare per classe dello studente, ma B_Class viene prima, poi A_Class, quindi C_Class. Inoltre, voglio ordinare per nome dello studente in ordine alfabetico. Come posso fare questo?

HTML:

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

Controller:

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

    }); 
}; 
+1

Ci sono due modi per farlo (1) Filtro Personalizzato (2) Breve vostri dati a livello di controller – dhavalcengg

+0

@dhavalcengg Quindi devo usare il filtro? –

+1

Attenzione per l'errore di battitura in '$ scope.studens' (manca un t) – Gamb

risposta

19

Hi è possibile creare personalizzato SORT FILTER vedere qui http://jsbin.com/lizesuli/1/edit

html:

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

filtro 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

Questo è esattamente quello che stavo cercando. Grazie. –

+2

Salve, 'angular.forEach (articoli, funzione (articolo) { filtered.push (articolo); });' questo codice non mi sembra necessario, non è sufficiente dire 'var filtered = items;' – codtex

-1

per impostare il orderBy come una proprietà degli oggetti solo citare che il nome della proprietà all'interno della marcatura:

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

DEMO

+0

Grazie, ma voglio ordinare che B_Class vada per primo. Non è un ordine alfabetico. –

10

che questo è vecchio, ma può rivelarsi utile per altri ...

È anche possibile creare una semplice funzione di ordinamento personalizzato. "Non proprio un filtro":

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

      case 'B_Class': 
       return 1; 

      case 'C_Class': 
       return 3; 
     } 
    }; 

E poi usare come si voleva:

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