¿Cómo hacer que el filtro orderby funcione en una matriz de cadenas?

85

Aquí está el código que no funciona: Demo: http://jsfiddle.net/8dt94/63/

<div ng-controller="MyCtrl">    
    <input type="text" ng-model="searchText" />
  <ul ng-repeat="strVal in arrVal|orderBy|filter:searchText" >
      <li>{{strVal}}</li>
  </ul>
</div>

var app=angular.module('myApp', []);
app.controller('MyCtrl', function ($scope,$filter) {
  $scope.arrVal = ['one','two','three','four','five','six'];  
});
SunnyShah
fuente
No creo que debas usar valores primitivos en tu matriz ng-repeat. Si no funciona. ( jsfiddle.net/EGVwG ).
Tosh
Esta pregunta todavía se aplica al atributo ng-options de una selección, que debe ser una lista de cadenas.
Tren España

Respuestas:

248

Puede ordenar por un método, por lo que puede usar el método toString

<ul ng-repeat="strVal in arrVal | orderBy:'toString()' | filter:searchText">
noclive
fuente
+1. Además, puede agregar "track by" al final: <ul ng-repeat = "strVal in arrVal | orderBy: 'toString ()' | filter: searchText track by $ index">
Amy
9
Gran solución, necesitaba una matriz de números ordenados de esta [2,5,3,1,6, 33]manera, así que en lugar de toString()eso, usé valueOf()y funcionó perfectamente. Gracias por la solucion
ug_
¡Esto también funcionó para mí! ¿Alguna idea de por qué funciona este truco?
elethan
11

Escribe un filtro personalizado :

app.filter('mySort', function() {
    return function(input) {
      return input.sort();
    }
  });

HTML:

<ul ng-repeat="strVal in arrVal|filter:searchText|mySort">

Violín .

Mark Rajcok
fuente