Нокаут.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 ' - мой узел.