2014-04-17 17 views
7

Dostaję jakieś dane w formacie JSON, który zawiera spacje w niektóre klawisze:angularjs ngRepeat orderby gdy klucz obiekcie obowiązuje

[ 
    { 
     "PlainKey": "SomeValue", 
     "Spaced Key": "SomeValue" 
    }, 
    { 
     "PlainKey": "SomeValue2", 
     "Spaced Key": "SomeValue2" 
    } 
] 

Dzieje się tak w pewnym momencie:

$http.get('https://dl.dropboxusercontent.com/u/80497/htmlTesting/properties/credits.properties' + '?callback=JSON_CALLBACK').then(function (data) { 
      $scope.credits = data.data; 
     }, function (error) { 
      $scope.errorOccured = true; 
      console.log("Error:"); 
      console.log(error); 
     }); 

a następnie ng-repeat jest używany, aby go wyświetlić, ze zamawiającego:

<select ng-model="corder"> 
    <option value="PlainKey">Plain Key</option> 
    <option value="Spaced Key">Spaced Key</option> 
</select> 

<li ng-repeat="credit in credits | orderBy:corder" > 
..... 
</li> 

to nie zadziała (dostaję e xception) (The PlainKey działa, ponieważ nie ma spacji).

Próbowałem też wprowadzenie wartości w ':

<select ng-model="corder"> 
    <option value="'PlainKey'">Plain Key</option> 
    <option value="'Spaced Key'">Spaced Key</option> 
</select> 

Wydaje się to zmienić kolejność, ale nie poprawnie.

Czego mi brakuje?

Dzięki!

+0

Enclosing 'Spaced Key' z apostrofami powoduje, że 'orderBy' szuka własności obiektu za pomocą klawisza' 'Spaced Key'', z cytatami zawartymi w elemencie al nazwa nieruchomości. W związku z tym spodziewa się, że coś takiego jak '$ scope.credits [0] [" 'Spaced Key ""] będzie dostępne. Ponieważ nie jest to dostępne, dlatego widzisz niespójne zachowanie. – miqid

+0

@miqid Okay, dzięki. Jak więc zamówić w tym scenariuszu "Spaced Key"? – Ben

+1

Zamiast tego można podać 'orderBy' z funkcją sortowania predykatów (w przeciwieństwie do nazwy właściwości, według której sortowane będą). Oto [Plunker] (http://plnkr.co/edit/Mwe2xu26c1KHeT4KhTDg?p=preview), aby pokazać, co mam na myśli. – miqid

Odpowiedz

7

Komentarze pojawiły się pomóc, więc jestem tym go jako odpowiedź:

Jednym ze sposobów sortowania elementów z przestrzeni w ich nazwach własności celem jest przekazać funkcję sortowania orzecznikiem w orderBy zamiast podając nazwę właściwości obiektu . Odpowiednie modyfikacje w szczególności:

HTML:

<li ng-repeat="credit in credits | orderBy:predicate"> 

JS:

$scope.predicate = function(val) { 
    // $scope.corder corresponds to the object property name to sort by 
    return val[$scope.corder]; 
} 

pokazowe Plunker.

+0

Ilekroć używam predykatu takiego jak ten, a nie funkcję w moim kontrolerze, otrzymuję wyniki, które niemal wydają się sortowane losowo. Za każdym razem, gdy się to uda, zamówienie zostanie przetasowane. –

10

Najprostszy sposób, po prostu otoczyć nazwę pola z kodem UTF-8 za cudzysłowem:

HTML

<li ng-repeat="item in items | orderBy:'\u0022Spaced Key\u0022'"> 

JS

$scope.orderKey = '\u0022Spaced Key\u0022'; 
+3

Nice! To najlepsza odpowiedź, metinks. – bioball

Powiązane problemy