Нокаут.js: несколько Привязок ViewModel на странице или части страницы
мне интересно, можно ли использовать нокаут.js ' s ko.applyBindings()
несколько раз, чтобы привязать разные ViewModels к одной части страницы. Например, предположим, у меня было следующее:
<div id="foo">...</div>
...
ko.applyBindings(new PageViewModel());
ko.applyBindings(new PartialViewModel(), $('#foo')[0]);
Теперь я применяю две привязки ViewModel к <div id="foo>
. Это законно?
4 ответов
вы не хотите звонить ko.applyBindings несколько раз на одних и тех же элементах. В лучшем случае элементы будут выполнять больше работы, чем необходимо при обновлении, в худшем случае у вас будет несколько обработчиков событий для одного и того же элемента.
есть несколько вариантов обработки этого типа вещей, которые подробно описаны здесь:пример шаблона knockoutjs для многовидовых приложений
Если вам действительно нужен "остров" в середине вашего контента что вы хотите вызвать применить привязки позже, то вы можете использовать метод, описанный здесь:http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html
это общий блок дороги, который приходит при реализации JqueryMobile-SPA.
Метод : ко.applyBindings(viewmode
,root dom element
) принимает два аргумента. Второй аргумент полезен, когда на Вашей странице есть несколько виртуальных машин.
например :
ko.applyBindings(model1, document.getElementById("view1"));
ko.applyBindings(model2, document.getElementById("view2"));
где view1 и view2 являются корневым элементом dom для этой модели. Для JQUERYMOBILE-SPA это будут идентификаторы страниц для соответствующей модели.
лучший способ сделать это-использовать конструкцию привязки "with" в div, которую вы хотите привязать к модели частичного представления. Вы можете найти его в этом скрипка
<div data-bind="with: model">
<p data-bind="text: name"></p>
</div>
<div data-bind="with: anothermodel">
<p data-bind="text: name"></p>
</div>
var model = {
name: ko.observable('somename'),
}
var anothermodel = {
name: ko.observable('someanothername'),
}
ko.applyBindings(model);
также проверить "с" обязательной документации на сайте нокаута, чтобы посмотреть на сценарий частичной привязки обратного вызова AJAX.
мой английский очень плох.... =)
Я использую Sammy для загрузки частичных представлений и нокаута для привязки модели, я пытаюсь использовать ko.cleanNode
но очистите все мои привязки, все узлы DOM изменились, когда есть привязка, свойство __ko__
агрегируется, затем я удалил это свойство с помощью этого кода и работает !!, '#main'
мой узел.
var dom = dom || $("#main")[0];
for (var i in dom) {
if (i.substr(0, 6) == "__ko__") {
delete (dom[i]);
break;
}
}
после использования Ggle переводчик:
Я использую Sammy для загрузки частичных представлений и нокаута для привязки модели, я пытаюсь использовать нокаут.cleanNode но очистите все мои привязки, все узлы DOM изменились, когда у них есть привязка, свойство ko агрегируется, затем я удалил это свойство с помощью этого кода и работает !!, '#main ' - мой узел.