Como fazer o filtro orderby funcionar em uma série de strings?

86

Aqui está o código que não está funcionando: 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
fonte
Não acredito que você deva usar valores primitivos em seu array ng-repeat. Se não, funciona. ( jsfiddle.net/EGVwG ).
Tosh
Esta questão ainda se aplica ao atributo ng-options de um select, que deve ser uma lista de strings.
Espanha Train

Respostas:

248

Você pode pedir por um método, então você pode usar o método toString

<ul ng-repeat="strVal in arrVal | orderBy:'toString()' | filter:searchText">
notclive
fonte
+1. Além disso, você pode adicionar "track by" ao final: <ul ng-repeat = "strVal in arrVal | orderBy: 'toString ()' | filter: searchText track by $ index">
Amy
9
Ótima solução, eu precisava de uma matriz de números classificados dessa [2,5,3,1,6, 33]forma, então em vez f toString()usei valueOf()e funcionou perfeitamente. Obrigado pela solução.
ug_
Isso funcionou para mim também! Alguma ideia de por que esse truque funciona?
elethan
11

Escreva um filtro personalizado :

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

HTML:

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

Fiddle .

Mark Rajcok
fonte