Можете ли вы вызвать ko.applyBindings, чтобы связать частичное представление?
Я использую KnockoutJS и имею основной вид и вид модели. Я хочу, чтобы диалоговое окно (JQuery UI) всплыло с другим представлением, с которым должна быть связана отдельная модель дочернего представления.
HTML-код для содержимого диалога извлекается с использованием AJAX, поэтому я хочу иметь возможность вызывать ko.applyBindings
как только запрос завершен, и я хочу связать дочернюю модель представления только с той частью HTML, загруженной через ajax внутри диалогового окна div.
Это на самом деле возможно, или мне нужно загрузить ВСЕ мои представления и модели просмотра при начальной загрузке страницы, а затем вызвать ko.applyBindings
один раз?
4 ответа
ko.applyBindings
принимает второй параметр, который является элементом DOM для использования в качестве корневого.
Это позволит вам сделать что-то вроде:
<div id="one">
<input data-bind="value: name" />
</div>
<div id="two">
<input data-bind="value: name" />
</div>
<script type="text/javascript">
var viewModelA = {
name: ko.observable("Bob")
};
var viewModelB = {
name: ko.observable("Ted")
};
ko.applyBindings(viewModelA, document.getElementById("one"));
ko.applyBindings(viewModelB, document.getElementById("two"));
</script>
Таким образом, вы можете использовать эту технику для привязки viewModel к динамическому контенту, который вы загружаете в свой диалог. В общем, просто хочется быть осторожным, чтобы не звонить applyBindings
несколько раз для одних и тех же элементов, так как вы получите несколько обработчиков событий.
Хотя ответ Нимейера является более правильным ответом на вопрос, вы также можете сделать следующее:
<div>
<input data-bind="value: VMA.name" />
</div>
<div>
<input data-bind="value: VMB.name" />
</div>
<script type="text/javascript">
var viewModels = {
VMA: {name: ko.observable("Bob")},
VMB: {name: ko.observable("Ted")}
};
ko.applyBindings(viewModels);
</script>
Это означает, что вам не нужно указывать элемент DOM, и вы даже можете привязать несколько моделей к одному элементу, например так:
<div>
<input data-bind="value: VMA.name() + ' and ' + VMB.name()" />
</div>
Мне удалось связать пользовательскую модель с элементом во время выполнения. Код здесь: http://jsfiddle.net/ZiglioNZ/tzD4T/457/
Интересно, что я применяю атрибут data-bind к элементу, который не определил:
var handle = slider.slider().find(".ui-slider-handle").first();
$(handle).attr("data-bind", "tooltip: viewModel.value");
ko.applyBindings(viewModel.value, $(handle)[0]);
Вы должны посмотреть на with
обязательный, а также controlsDescendantBindings
http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html