Могу ли я динамически связать элемент внутри пользовательского связывания?
Есть ли способ связать элементы изнутри пользовательского связывания? Например, у меня есть пользовательская привязка и привязка к ней наблюдаемого массива элементов:
var someArrayOfItems = ko.observableArray(['item1', 'item2', 'item3']);
...
<div data-bind="myBinding: someArrayOfItems"></div>
Теперь я бы хотел, чтобы myBinding перечислял все элементы из someArrayOfItems внутри элемента div, которому он был привязан:
<ul data-bind="foreach: someArrayOfItems">
<li>
<span data-bind="text: $data"></span>
</li>
</ul>
Можно ли сделать такую операцию с помощью пользовательского связывания? Спасибо за любую помощь.
1 ответ
Решение
Вы можете использовать функцию ko.applyBindingsToNode
динамически добавлять привязку к элементу.
В вашем случае вам также необходимо заполнить содержимое соответствующим "шаблоном".
Например, вы можете сделать что-то вроде:
ko.bindingHandlers.myBinding = {
init: function(element, valueAccessor) {
var ul = document.createElement("ul"),
data = valueAccessor();
//append a new ul to our element
element.appendChild(ul);
//could use jQuery or DOM APIs to build the "template"
ul.innerHTML = "<li><span data-bind='text: $data'></span></li>";
//apply foreach binding to the newly created ul with the data that we passed to the binding
ko.applyBindingsToNode(ul, { foreach: data });;
//tell Knockout that we have already handled binding the children of this element
return { controlsDescendantBindings: true };
}
};
Пример здесь: http://jsfiddle.net/rniemeyer/z458E/