你能调用ko.applyBindings来绑定局部视图吗?

时间:2011-09-08 03:25:55

标签: ajax html5 knockout.js

我正在使用KnockoutJS并拥有主视图和视图模型。我想要一个对话框(jQuery UI one)弹出另一个视图,该视图要绑定一个单独的子视图模型。

使用AJAX检索对话框内容的HTML,因此我希望能够在请求完成后调用ko.applyBindings,并且我想将子视图模型绑定到仅通过加载的HTML部分对话框div中的ajax。

这实际上是否可行,或者我是否需要在页面最初加载时加载所有视图并查看模型,然后再调用ko.applyBindings一次?

4 个答案:

答案 0 :(得分:429)

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,因为您将获得多个事件处理程序。

答案 1 :(得分:60)

虽然Niemeyer的答案是对问题更正确的答案,但您可以也执行以下操作:

<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>

答案 2 :(得分:6)

我设法在运行时将自定义模型绑定到元素。代码在这里: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]);

答案 3 :(得分:0)

您应该查看with绑定以及controlsDescendantBindings http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html