Jak wymusić odświeżenie widoku bez automatycznego uruchamiania go z obserwowalnego?

151

Uwaga: dotyczy to głównie debugowania i zrozumienia KnockoutJS.

Czy istnieje sposób, aby jawnie zażądać Knockout w celu odświeżenia widoku z (już powiązanego) modelu widoku? Szukam czegoś takiego:

ko.refreshView();

Rozumiem, że nie jest to zamierzone użycie Knockouta, ale nadal chcę wiedzieć, czy istnieje taka metoda do debugowania i uczenia się.

THX-1138
źródło

Odpowiedzi:

252

Nie możesz wywołać czegoś w całym modelu viewModel, ale w przypadku pojedynczego obserwowalnego możesz zadzwonić, myObservable.valueHasMutated()aby powiadomić subskrybentów, że powinni ponownie ocenić. Jak wspomniałeś, generalnie nie jest to konieczne w KO.

RP Niemeyer
źródło
5
Możesz również iterować po kontekście danych, wyszukując elementy, które mają valueHasMutatedwłaściwość typu functioni wywołując ją dla każdego z nich. Powinno to uzyskać wszystkie twoje obserwowalne, ale jest to zła praktyka i można sobie wyobrazić o wiele więcej aktualizacji, niż się spodziewasz (pomyśl o obliczonych łańcuchach zależności).
Patrick M
Na pewno byłoby miło gdyby nie nic innego - testowanie w chrome.
Scott Romack,
Twój model viewModel może sam w sobie być obserwowalny, więc możesz wywołać myViewModel.valueHasMutated()aktualizację całego widoku.
Roy J,
2
Tutaj też nie działa na tablicach. W rzeczywistości tablice wydają się w ogóle nie działać w Knockout. Tęsknię za
Angularem
2
Działa na KnockoutObservableArrays od KO 3.5
balint
25

W niektórych okolicznościach przydatne może być po prostu usunięcie powiązań i ponowne zastosowanie:

ko.cleanNode(document.getElementById(element_id))
ko.applyBindings(viewModel, document.getElementById(element_id))
ProfNimrod
źródło
Dzięki za edycję ebram ... Chyba powinienem był wspomnieć, że używam coffeescript ;-)
ProfNimrod
15
Uważaj, jeśli używasz również jQuery (np. Podczas migracji bitów aplikacji do ko), ponieważ cleanNode usunie również inne zdarzenia dom.
Dan Revell
To jest doskonałe. Nie mogę zmusić KO do rozpoznania NOWYCH elementów potomnych dom z atrybutami wiązania danych po zastosowaniu modelu widoku.
Andrew T Finnell
Idealny! Pracujący!
jeff_drumgod
0

Utworzyłem JSFiddle z moim programem obsługi wiązania bindHTML knockout tutaj: https://jsfiddle.net/glaivier/9859uq8t/

Najpierw zapisz program obsługi powiązań we własnym (lub wspólnym) pliku i dołącz go po Knockout.

Jeśli używasz tego, zmień swoje wiązania na to:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
James „Fluffy” Burton
źródło