2013-05-24 20 views
5

Seçilmiş bir liste için knockout.js kullanarak sıralanmış bir listeye sahiptim. Sıralanmamış bir liste için onu dönüştürmek istiyorum. Bir listeyi knockout.js ile sıralamak için yöntem nedir? Ben hata düşünüyorum ile geçerli:. AllItems() uzunluğu> 1Knockout.js sıralama listesi

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> 

cevap

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

Artan ve azalan sıralama için size cevap düzenleyebilir misiniz? Kafam karıştı, a ve b nedir? – Ahmed

+0

'a' ve 'b', uygulamanızda kullandığınız değişkenler değildir, aslında sıralama işlevinden rasgele değişkenler vardır, çünkü sıralama işlevleri 2 öğe ayırmak için 2 parametre almalıdır, doğru mu? :) – dpaul1994

+1

Genellikle kod örneğinizi açıkladığınız ve sadece bir kopyala yapıştırmanın yanı sıra cevap vermediğiniz kabul edilir. Bu, bu konu hakkında daha fazla bilgi edinmek için buraya gelen gelecekteki kullanıcılara yardımcı olur. –

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

hatları açıkladı: weWiliChangeTheArrayToValue (weWilSortTheArrayWithASpecialFunction (ComparatorFunction))

ComparatorFunction yani .

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

, sıralama işlevinin ... iyi sıralanmasına yardımcı olan özel bir işlevdir.
2 argüman alır ve ilk argüman 'büyük' ​​(listeden daha uzakta olmalı) ve ilk argüman 'küçük' ise 'false' doğru döndürür.
Her (neredeyse) sıralama algoritması, 2 elementi karşılaştırarak çalışır sıralı koleksiyonun hepsi sıraya girene kadar. Eğer olmayan karşılaştırırsanız: Bunu yapmak için en kolay yolu <

EDIT'e bir şey daha> operasyonu değiştirerek olduğunu - sırasını değiştirme
normalde gerçek döneceğini zaman işlev false döndürür emin olarak yapılır ASCII karakterleri a.localCompare (b) döndürmesini kullanır; (Ve b.localCompare (a) geri;) "-" numaralarını kullanımı ile ilgili ne zaman ve şarkı nedenle kullanımı dizi çiftleri ile kırılabilir ">" yukarıdaki yöntemi Uyarı aritmetik işlem

EDIT2
var

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

bunun yerine (veya yalnızca localCompare)

+0

Bu, doğru cevabı işaretlemelidir. Soruyu yanıtlar ve kod örneğinde neler olduğunu açıklar. +1 –