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ę.

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.


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

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 -->
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.