Як змусити оновити подання, не запускаючи його автоматично із спостережуваного?


151

Примітка. Це здебільшого для налагодження та розуміння KnockoutJS.

Чи є спосіб явно попросити Knockout оновити подання з (вже пов'язаної) моделі перегляду? Я шукаю щось на зразок:

ko.refreshView();

Я розумію, що це не призначене використання нокауту, але я все ж хочу знати, чи існує такий метод для налагодження та цілей навчання.

Відповіді:


252

Ви не можете щось зателефонувати в усьому viewModel, але на окремому спостережуваному місці ви можете зателефонувати, myObservable.valueHasMutated()щоб повідомити передплатників, що вони повинні повторно оцінити Як правило, це не потрібно в КО, як ви вже згадували.


5
Ви також можете переглядати контекст даних, шукаючи елементи, що мають valueHasMutatedвластивість типу, functionі називати його для кожного з них. Це має отримати всі ваші спостережувані дані, але це погана практика і, можливо, звільнити набагато більше оновлень, ніж ви передбачали (подумайте, обчислювані ланцюги залежностей).
Патрік М

Звичайно, було б добре, якби нічого іншого - тестування на хром.
Скотт Ромак

Ваш поглядModel сам по собі може бути спостережуваним, тому ви можете зателефонувати, myViewModel.valueHasMutated()щоб оновити весь погляд.
Roy J

2
Тут також не працює масив. Насправді масиви, схоже, не працюють у нокауті. Я сумую за Angular :-(
garryp

2
Це працює на KnockoutObservableArrays від KO 3.5
balint

25

За деяких обставин може бути корисним просто зняти прив'язки та повторно застосувати:

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

Дякую за редагування ebram ... Зрозуміло, я мав би згадати, що я використовую coffeescript ;-)
ProfNimrod

15
Слідкуйте, якщо ви також використовуєте jQuery (наприклад, при переміщенні бітів програми на ko), оскільки cleanNode також видалить інші події дому.
Dan Revell

Це прекрасно. Я не можу змусити KO розпізнавати НОВИХ дітей дому з атрибутами прив’язки даних після застосування модлера viewview.
Ендрю Т Фіннелл

Ідеально! Працюючи!
jeff_drumgod

0

Я створив JSFiddle з моїм обробником прив'язки нокаутів BindHTML тут: https://jsfiddle.net/glaivier/9859uq8t/

По-перше, збережіть оброблювач прив'язки у власний (або загальний) файл і включіть його після нокауту.

Якщо ви використовуєте цей перемикач, ваші прив'язки до цього:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.