Как заставить обновление представления, не вызывая его автоматически из наблюдаемой?


151

Примечание: это в основном для отладки и понимания KnockoutJS.

Есть ли способ явно запросить Knockout, чтобы обновить представление из (уже связанной) модели представления? Я ищу что-то вроде:

ko.refreshView();

Я понимаю, что это не предполагаемое использование Knockout, но я все еще хочу знать, существует ли такой метод для целей отладки и обучения.

Ответы:


252

Вы не можете вызывать что-то во всей viewModel, но для отдельной наблюдаемой вы можете позвонить, myObservable.valueHasMutated()чтобы уведомить подписчиков о том, что они должны переоценить. Как вы упомянули, в KO это обычно не требуется.


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

Было бы неплохо, если бы не что иное - тестирование в Chrome.
Скотт Ромак

Ваша viewModel сама по себе может быть наблюдаемой, так что вы можете вызвать myViewModel.valueHasMutated()обновление всего представления.
Рой Дж

2
Здесь тоже не работает с массивами. На самом деле, в Knockout массивы вообще не работают. Я скучаю по Angular :-(
garryp

2
Он делает работу по KnockoutObservableArrays от KO 3.5
Балинт

25

В некоторых случаях может быть полезно просто удалить привязки, а затем повторно применить:

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

Спасибо за редактирование ebram ... Думаю, я должен был упомянуть, что я использую coffeescript ;-)
ProfNimrod

15
Будьте внимательны, если вы также используете jQuery (например, при переносе битов приложения в ko), так как cleanNode также удалит другие события dom.
Дэн Ревелл

Это потрясающе. Я не могу заставить KO распознавать НОВЫХ дочерних элементов dom с атрибутами привязки данных после применения модели представления.
Эндрю Т Финнелл

Отлично! Работает!
jeff_drumgod

0

Я создал JSFiddle с моим обработчиком привязки нокаута bindHTML здесь: https://jsfiddle.net/glaivier/9859uq8t/

Сначала сохраните обработчик привязки в свой собственный (или общий) файл и включите его после Knockout.

Если вы используете это, переключите ваши привязки на это:

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

OR

<!-- ko bindHTML: htmlValue --><!-- /ko -->
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.