2013-05-24 1 views
5

Ho avuto un elenco ordinato utilizzando knockout.js per un elenco selezionato. Voglio convertirlo per una lista non ordinata. Qual è il metodo per ordinare una lista con knockout.js? Sto pensando l'errore è con:. AllItems() Lunghezza> 1Lista di ordinamento Knockout.js

http://jsfiddle.net/infatti/Ky5DK/

var BetterListModel = function() { 
    this.allItems = ko.observableArray([ 
     { name: 'Denise' }, 
     { name: 'Charles' }, 
     { name: 'Bert' } 
    ]); // Initial items 

    this.sortItems = function() { 
     this.allItems.sort(); 
    }; 
}; 

ko.applyBindings(new BetterListModel()); 


<button data-bind="click: sortItems, enable: allItems().length > 1">Sort</button> 

risposta

7
this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;})); 
+0

può per favore edita si risponde per l'ordinamento ascendente e discendente? Sono confuso cosa sono a e b? – Ahmed

+0

'a' e 'b' non sono variabili che si utilizzano nell'applicazione, quelle sono in realtà alcune variabili casuali dalla funzione di ordinamento, perché le funzioni di ordinamento devono ricevere 2 parametri per l'ordinamento di 2 elementi, giusto? :) – dpaul1994

+1

È generalmente accettato in SO che tu spieghi il tuo esempio di codice e non fornisca solo una copia e incolla la risposta. Questo aiuta i futuri utenti che arrivano qui alla ricerca di ulteriori informazioni su questo argomento. –

4
var BetterListModel = function() { 
    this.allItems = ko.observableArray([ 
    { name: 'Denise' }, 
    { name: 'Charles' }, 
    { name: 'Bert' } 
    ]); // Initial items 

    this.sortItemsAscending = function() { 
     this.allItems(this.allItems().sort(function(a, b) { return a.name > b.name;})); 
    }; 

    this.sortItemsDescending = function() { 
     this.allItems(this.allItems().sort(function(a, b) { return a.name < b.name;})); 
    }; 
}; 

linee spiegato: weWiliChangeTheArrayToValue (weWilSortTheArrayWithASpecialFunction (ComparatorFunction))

ComparatorFunction vale a dire .

function(a, b) { return a.name < b.name;} 

è una funzione speciale che aiuta la funzione di ordinamento a ... ordinamento.
Prende 2 argomenti e li confronta restituendo true se il primo argomento è "più grande" (dovrebbe essere più lontano nell'elenco) e false se il primo argomento è "minore"
Ogni algoritmo di ordinamento (quasi) funziona confrontando 2 elementi di raccolta differenziata fino a quando tutti sono in ordine.
Cambiare l'ordine è fatto facendo in modo che la funzione restituisce false quando sarebbe tornato vero normalmente - modo più semplice per farlo è cambiando il> operazione per <

EDIT una cosa: se si confronta non I caratteri ASCII usano return a.localCompare (b); (E tornare b.localCompare (a);) e quando si tratta di numeri uso "-" cantare quindi è un'operazione aritmetica

EDIT2
Attenzione il metodo di cui sopra ">" potrebbe rompere con i duplicati in serie utilizzare

return a.name < b.name ? -1 : a.name > b.name ? 1 : 0; 

invece (o solo localCompare)

+0

Dovrebbe essere contrassegnata la risposta corretta. Risponde alla domanda e spiega cosa sta succedendo nell'esempio di codice. +1 –