2012-03-21 22 views
8

'Firstname', 'lastname' özelliklerine sahip bir koleksiyonda bir kullanıcı listesine (tam olarak altı olmak üzere) sahibim. Bir getirme yapmak, aşağıdaki karşılaştırıcı bunları 'firstname' ile sıralar ve iyi çalışır. Ben farklı bir değerle, daha sonra toplama sıralamak denersenizBackbone/Underscore sortBy koleksiyon sıralama değil

comparator : function (user) { 
    return user.get("firstname").toLowerCase(); 
} 

Ama yani 'soyad', bu işe yaramaz. Sipariş aynı kalır.

this.collection.sortBy(function(user) { 
    return user.get("lastname").toLowerCase(); 
}); 

Neyi yanlış yapıyorum?


Güncelleme


Yani SortBy dönen veriler sıralanır IS ama benim bakış koleksiyonunuz arasında bağlantı olarak bu gerçekten bana yardımcı olmuyor. Koleksiyonu sıfırlar ve sıralanmış diziyi tekrar koleksiyona eklersek, karşılaştırıcı iş yapar ve 'ad' sırasına göre sıralar.

var sorted = this.collection.sortBy(function(user) { 
    return user.get("lastname").toLowerCase(); 
}); 

cevap

11

sortBy işlevi geçerli koleksiyonunda nesneleri sıralamak değildir. Bu sıralı koleksiyon döndürür:


var sortedCollection = this.collection.sortBy(function(user){ 
    return user.get("lastname").toLowerCase(); 
}); 

Şimdi sortedCollection kullanabilir ve doğru sıralanacaktır. Omurga kullanan

+0

Teşekkürler Derick. Ve siteniz için teşekkürler. Bu harika bir geliştirici kaynağıdır. – screenm0nkey

+0

, karşılaştırıcı işlevinin tam sayı döndürmesi değil mi? –

+2

Bunun bir koleksiyon değil, bir liste döndürdüğünü unutmayın. Büyük bir anlaşma değil ama bahsetmeye değer. – Chris

3

Underscore en sortBy, döner sıralanmış toplama göstermek için ... yerde sıralamak değil: Eğer

isteyen konum:

var flinstones = [{first: 'Baby', last: 'Puss'}, {first: 'Fred', last: 'Flinstone'}]; 
var sorted = _.sortBy(flinstones, function (character) { return character.last ; }); 
console.log(sorted); 
console.log(flinstones); 
+1

+1 Yanıtınız için teşekkür ederiz. – screenm0nkey

13

Güncellemenize yanıtlamak için koleksiyonun ilgili görünüm tarafından kullanılmak üzere düzenlendiği sırayı değiştirmek için comparator'u güncelleyebilir ve daha sonra modeli yeniden sıralamak için sort'u arayabilirsiniz. Bu, daha sonra görüşünüzü buna göre dinleyebilecek ve güncelleyebilecek bir olayını tetikleyecektir.

this.collection.comparator = function (user) { 
    return user.get("firstname").toLowerCase(); 
}; 

this.collection.sort(); 
+0

+1 Yanıtınız için teşekkür ederiz. O zaman bunu yapacağım. – screenm0nkey

+0

Bu kesinlikle burada en iyi cevaptır. – Chris

İlgili konular