KnockoutJS - с открытым исходным кодом. Из relevant file:
ko.applyBindings = function (viewModelOrBindingContext, rootNode) {
// Some code omitted for brevity...
if (rootNode && (rootNode.nodeType !== 1) && (rootNode.nodeType !== 8))
throw new Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
rootNode = rootNode || window.document.body; // Make "rootNode" parameter optional
applyBindingsToNodeAndDescendantsInternal(getBindingContext(viewModelOrBindingContext), rootNode, true);
};
Так что да, это кажется, что это должен быть один узел DOM. Чтобы быть более конкретным, nodeType должен быть либо 1 (ELEMENT_NODE
), либо 8 (COMMENT_NODE
), в противном случае возникает ошибка.
relevant documentation ("Activating Knockout") менее явно, что он должен быть DOM узел, но (см акцент, добавленный мной) не вид сказать то же самое:
При желании, вы можете передать второй параметр, чтобы определить который часть документа вы хотите найти data-bind
атрибутов. Например, ko.applyBindings(myViewModel, document.getElementById('someElementId'))
. Это ограничивает активацию элемента с идентификатором someElementId
и его потомками, что полезно, если вы хотите иметь несколько моделей просмотра и связывать их с другой областью страницы.
Пока узлы не разделяют часть дерева (например, они братья и сестры), вы можете позвонить applyBindings безопасно на каждом из узлов (на самом деле, это одна из причин, чтобы использовать второй аргумент).
См. this related question для типичного варианта использования.
Добавление исходного кода KO в ответ было приятным. –