2013-09-24 3 views
25

Я искал, но не могу найти документацию для applyBindings(). Что может содержать второй параметр на законных основаниях? Может ли это быть множеством элементов? Должен ли он быть одним элементом? Можно ли привязать привязки к дочерним элементам двух отдельных узлов, дважды нажав applyBindings?Какой второй параметр applyBindings используется?

 ko.applyBindings(myViewModel, div1); 
     ko.applyBindings(myViewModel, div2); 

ответ

37

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 для типичного варианта использования.

+2

Добавление исходного кода KO в ответ было приятным. –

10

Можно найти по следующей ссылке ... http://knockoutjs.com/documentation/observables.html

В случае, если вам интересно, что параметры в ko.applyBindings сделать,

Первый параметр говорит, что посмотреть объект модели вы хотите для использования с декларативные привязки, которые он активирует

Возможно, вы можете передать второй параметр, чтобы определить, какая часть документа, который вы хотите найти для атрибутов привязки данных. Например, ko.applyBindings (myViewModel, document.getElementById ('someElementId')). Это ограничивает активацию элемента с идентификатором someElementId и его потомками , что полезно, если вы хотите иметь несколько моделей просмотра и ассоциировать , каждый с другой областью страницы.

2

В случае, если кто стремится использовать классы для реализации этого

for i of $('.myView') 
    ko.applyBindings(new MyView(),$('.myView')[i]) 
+0

этот код создает n экземпляров MyView, которые не связаны друг с другом. Во многих случаях это плохое решение –

0

если вы используете JAVA Script затем для узла корневого элемента

ko.applyBindings(vm, document.getElementById("yourRootID")); 

В моем случае HTML, как это :

<table id="yourRootID" border="1" class="table"> 
    <thead> 
     <tr data-bind="foreach: columnNames"> 
      <th> <span data-bind="text: $data"></span></th> 
     </tr> 
    </thead> 
    <tbody data-bind="foreach: items"> 
     <tr data-bind="foreach: $parent.columnNames"> 
      <td data-bind="text: $parent[$data]"></td> 
     </tr> 
    </tbody> 
</table> 

запомнить Использовать документ.el ementByID, потому что он требует корневого узла

Смежные вопросы