2014-04-17 19 views
7

che sto ricevendo alcuni dati in formato JSON, che ha spazi nel alcune delle chiavi:angularjs ngRepeat orderBy quando chiave struttura dispone di spazi

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

Questo accade ad un certo punto:

$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); 
     }); 

e poi ng-repeat è usato per visualizzarlo, con l'ordinazione:

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

Questo non funziona (ho una e xception) (Il PlainKey funziona perché non ci sono spazi).

Ho anche provato a mettere i valori in ':

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

Questo sembra cambiare l'ordine, ma non in modo corretto.

Cosa mi manca?

Grazie!

+0

Enclosing 'Spaced Key' con apici causa 'orderBy' per cercare una proprietà dell'oggetto con la chiave' 'Spaced Key'', con le virgolette incluse nell'attuatore al nome della proprietà. Quindi, si aspetta qualcosa come '$ scope.credits [0] [" 'Spaced Key' "]' per essere accessibile. Dal momento che questo non è disponibile, è per questo che si vede il comportamento incoerente. – miqid

+0

@miqid Va bene, grazie. Quindi, come faresti per "Spaced Key" in questo scenario? – Ben

+1

Si potrebbe invece fornire 'orderBy' con una funzione di ordinamento dei predicati (al contrario del nome di una proprietà da ordinare per). Ecco un [Plunker] (http://plnkr.co/edit/Mwe2xu26c1KHeT4KhTDg?p=preview) per dimostrare cosa intendo. – miqid

risposta

7

commenti apparsi per aiutare in modo da sto includendolo come una risposta:

Un modo per ordinare gli elementi con gli spazi nei loro nomi di proprietà degli oggetti è quello di passare una funzione predicato di sorta in orderBy invece di specificare il nome della proprietà dell'oggetto . Le modifiche rilevanti in particolare:

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]; 
} 

dimostrazione Plunker.

+0

Ogni volta che uso un predicato come questo come filtro e non una funzione nel mio controller, ottengo risultati che sembrano quasi ordinati casualmente. Ogni volta che viene fatto ricorso, l'ordine verrà mescolato. –

10

più semplice modo, proprio circondare un nome di campo con il codice UTF-8 per la virgoletta:

HTML

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

JS

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

Bello! Questa è la migliore risposta, pensate. – bioball

Problemi correlati