2012-05-07 17 views
6

Görüntüleme modelimde ObserableArray'ım var. ViewModel'i başlattıktan hemen sonra, verileri başarıyla bağlar. O zaman, yapmam gereken şey koleksiyonu sıralamak. Gördüğünüz gibiknockoutjs GözlemlenebilirArray'ler ve sıralama işlevi: UI güncelleştirilmedi

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

vm.searchResults().sort(function (a, b) { 
    return a.Name().toLowerCase() > b.Name().toLowerCase() ? 1 : -1; 
}); 

$.each(vm.searchResults(), function (i, property) { 
    console.log(property.Name()); 
}); 

, ben çıkış konsoluna elemanın adı öncesi ve ayırma sonrası düzeni görmek için. Sıralama iyi çalışıyor. Sorun, kullanıcı arayüzü güncellemesiyle ilgilidir. Her nasılsa, kullanıcı arayüzü güncellenmez.

Sonra UI o ya da değil yanıt verecektir görmek için aşağıdaki kodla diziden bir kaydı kaldırmak için deneyin:

vm.searchResults().shift(); 

UI aynı kalır ve tekrar güncelleme vermedi. Burada sorun ne olurdu?

Düzenleme: burada da http://jsfiddle.net/tugberk/KLpwP/

aynı sorun: Burada

yanı örnek bir durumdur.

Düzenleme: http://jsfiddle.net/tugberk/KLpwP/16/ Ama Önce denedim olarak işe yaradı neden hala emin değilim: Bu örnekte gösterildiği gibi

Ben sorunu çözüldü.

cevap

18

Sıralamak istediğinizde, gözlemlenebilir bir dizini temizliyorsunuz. Bu sorun nedenidir, çünkü KO dizisini takip edemedi. ko.observableArray(), aynı imzaya sahip sort işlevine sahiptir ve gözlenebilir aboneleri değiştirildiğini bildirir. Çözüm çok basittir: vm.searchResults().sort parantezini kaldırın =>vm.searchResults.sort. Ödeme benim örneğim: http://jsfiddle.net/RbX86/

Bu dizinin KO değişkenlerini değiştirmenin başka bir yolu - diziyle işledikten sonra valueHasMutated yöntemini arayın. Lütfen bu örneği gözden geçirin: http://jsfiddle.net/RbX86/1/ Bu yaklaşım, dizinizde birçok değişiklik yapmanız gerektiğinde ve UI'yi yalnızca bir kez yenilemek istediğinizde çok iyidir.