Bir gözlemlenebilirden otomatik olarak tetiklemeden bir görünüm yenilemeyi nasıl zorlarsınız?


151

Not: Bu çoğunlukla KnockoutJS hata ayıklama ve anlama içindir.

Nakavt'tan (zaten bağlı) görünüm modelinden görünümü yenilemesini açıkça istemenin bir yolu var mı? Gibi bir şey arıyorum:

ko.refreshView();

Bunun Nakavt'ın kullanım amacı olmadığını anlıyorum, ancak yine de hata ayıklama ve öğrenme amaçlı böyle bir yöntem olup olmadığını bilmek istiyorum.

Yanıtlar:


252

ViewModel'in tamamında bir şey çağıramazsınız, ancak gözlemlenebilir bir kişide myObservable.valueHasMutated()aboneleri yeniden değerlendirmeleri gerektiğini bildirmek için arayabilirsiniz . Bu, bahsettiğiniz gibi KO'da genellikle gerekli değildir.


5
Veri bağlamı üzerinde yineleyebilir valueHasMutated, türünde bir özelliğe sahip öğeleri arayabilir functionve her biri için çağırabilirsiniz. Bu, tüm gözlemlenebilirlerinizi almalıdır, ancak bu kötü bir uygulamadır ve tahmin ettiğinizden çok daha fazla güncellemeyi tetikler (bilgisayarlı bağımlılık zincirlerini düşünün).
Patrick M

Başka bir şey olmasa iyi olur - kromda test etmek.
Scott Romack

Modeliniz kendisi gözlemlenebilir olabilir, böylece myViewModel.valueHasMutated() tüm görünümü güncellemek için .
Roy J

2
Burada diziler üzerinde de çalışmaz. Aslında Knockout'ta diziler hiç çalışmıyor gibi görünüyor. Angular özledim :-(
garryp

2
KO 3.5
balint

25

Bazı durumlarda, bağlamaları basitçe kaldırmak ve daha sonra tekrar uygulamak yararlı olabilir:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))

Düzenleme ebram için teşekkürler ... Sanırım ben kahve ;-) kullandım bahsetmeliydim
ProfNimrod

15
CleanNode da diğer dom olaylarını da kaldıracağından jQuery (örneğin, uygulamanın bitlerini ko'ya taşırken) kullanıp kullanmadığınıza dikkat edin.
Dan Revell

Bu harika. Bir viewmodel uygulandıktan sonra KO'yu veri bağlama özniteliklerine sahip YENİ dom çocuklarını tanıyamıyorum.
Andrew T Finnell

Mükemmel! Çalışma!
jeff_drumgod

0

Burada bindHTML nakavt bağlayıcı işleyicimle bir JSFiddle oluşturdum: https://jsfiddle.net/glaivier/9859uq8t/

İlk olarak, ciltleme işleyicisini kendi (veya ortak) bir dosyaya kaydedin ve Nakavttan sonra ekleyin.

Bu yöntemi kullanırsanız, bağlantılarınızı buna değiştirin:

<div data-bind="bindHTML: htmlValue"></div>

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.