2014-07-21 1 views
16

J'ai des objets comme celui-ci:commande personnalisée à l'aide orderBy en ng répétition

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'} 

Disons que les étudiants objet est brassés. J'utilise ng-repeat pour montrer les données. Je veux trier les objets dans l'ordre personnalisé.

Par exemple, je veux montrer les données comme ceci:

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 

Donc, fondamentalement, je veux commander par la classe de l'élève, mais il B_Class vient d'abord, puis A_Class, puis C_Class. Aussi, je veux commander par nom des étudiants dans l'ordre alphabétique. Comment puis-je faire ceci?

HTML:

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

Controller:

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

    }); 
}; 
+1

Il y a deux façons de le faire (1) Filtre Personnalisé (2) Court vos données au niveau du contrôleur – dhavalcengg

+0

@dhavalcengg Donc, je dois utiliser un filtre? –

+1

Attention à la faute de frappe dans '$ scope.studens' (manquant un t) – Gamb

Répondre

19

Salut, vous pouvez créer le Filtre tri personnalisé s'il vous plaît voir ici http://jsbin.com/lizesuli/1/edit

html:

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

filtre 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

C'est exactement ce que je cherchais. Merci. –

+2

Bonjour, 'angular.forEach (items, function (item) { filtered.push (item); });' ce code me semble inutile, n'est-ce pas suffisant pour dire 'var filtered = items;' – codtex

-1

pour définir la orderBy comme propriété des objets simplement citer que le nom de la propriété dans le balisage:

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

DEMO

+0

Merci, mais je veux commander B_Class en premier. Ce n'est pas l'ordre alphabétique. –

10

sais que c'est vieux mais peut être utile pour autres ...

Vous pouvez également créer une fonction de tri personnalisée simple. "Pas tout à fait un filtre":

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

      case 'B_Class': 
       return 1; 

      case 'C_Class': 
       return 3; 
     } 
    }; 

Et puis utiliser comme vous vouliez:

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

Questions connexes