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.