Подтвердить что ты не робот

Knockout.js: множественные привязки ViewModel на странице или части страницы

Мне интересно, можно ли несколько раз использовать Knockout.js ko.applyBindings() для привязки разных ViewModels к одной части страницы. Например, скажем, у меня было это:

<div id="foo">...</div>
...
ko.applyBindings(new PageViewModel());
ko.applyBindings(new PartialViewModel(), $('#foo')[0]);

Теперь я применяю два привязки ViewModel к <div id="foo>. Является ли это законным?

4b9b3361

Ответ 1

Вы не хотите вызывать ko.applyBindings несколько раз на тех же элементах. Лучший случай, элементы будут делать больше работы, чем необходимо при обновлении, в худшем случае у вас будет несколько обработчиков событий, запускаемых для одного и того же элемента.

Существует несколько вариантов обработки этого типа вещей, которые подробно описаны здесь: Пример шаблона knockoutjs для приложений с несколькими просмотрами

Если вам действительно нужен "остров" в середине вашего контента, который вы хотите называть позже, используйте метод, описанный здесь: http://www.knockmeout.net/2012/05/quick-tip-skip-binding.html

Ответ 2

Это общий дорожный блок, который появляется при реализации JqueryMobile-SPA. Метод: ko.applyBindings(viewmode, root dom element) принимает два аргумента. Второй аргумент полезен, если на вашей странице несколько VM.

например:

ko.applyBindings(model1, document.getElementById("view1")); 
ko.applyBindings(model2, document.getElementById("view2"));

где view1 и view2 являются корневым элементом dom для этой модели. Для JQueryMobile-SPA это будут идентификаторы страниц для соответствующей модели.

Ответ 3

Лучший способ сделать это - использовать конструкцию привязки "с" в div, которую вы хотите привязать к модели частичного просмотра. Вы можете найти его в этом fiddle

<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);​

Также проверьте "с" документацией по привязке на сайте Knockout, чтобы посмотреть сценарий обратного вызова AJAX - частичный привязку.

Ответ 4

Мой английский очень плохой.... =)

Я использую Sammy для загрузки частичных представлений, а Knockout для привязки модели, я пытаюсь использовать ko.cleanNode, но очистить все мои привязки, все узлы DOM изменились, когда имеет привязку, свойство __ko__ агрегировано, тогда я удалил это свойство с помощью этого кода и работает!!, '#main' - это мой node.

var dom = dom || $("#main")[0];
for (var i in dom) {
  if (i.substr(0, 6) == "__ko__") {
     delete (dom[i]);
     break;
  }
}

после использования переводчика Ggle:

Я использую Sammy для загрузки частичных представлений, а Knockout для привязки модели, я пытаюсь использовать ko.cleanNode, но очищать все мои привязки, все узлы DOM изменились, когда у них есть привязка, свойство ko, тогда я удалил это свойство с помощью этого кода и работает!!, '#main' - это мой node.