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

Cha*_*lie 256 ajax html5 knockout.js

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

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

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

RP *_*yer 430

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>
Run Code Online (Sandbox Code Playgroud)

因此,您可以使用此技术将viewModel绑定到加载到对话框中的动态内容.总的来说,您只需要注意不要applyBindings在相同的元素上多次调用,因为您将获得多个事件处理程序.

  • 如果您还希望在某个时刻删除绑定,可以调用`ko.cleanNode(document.getElementById("one")`来清理它们或者`ko.removeNode(document.getElementById("one")`清理并从DOM中删除节点. (17认同)
  • 请注意,`cleanNode`和`removeNode`不会删除事件处理程序,因此请谨慎使用.在某些情况下,最好在这些区域使用`template`或`with`绑定,因此您可以渲染新元素. (7认同)
  • 目前这是KO所缺乏的.我们并不打算让人们"重新绑定"部分.但是,如果引用了KO,KO会使用jQuery附加事件,因此您可以执行`$(element).unbind();`来删除所有处理程序. (7认同)
  • 这些函数(applyBindings,cleanNode,removeNode)在哪里记录?我在knockoutjs.com上找不到他们的功能签名. (5认同)
  • 如果这是在文档中可以轻松找到的地方,那就太好了.我甚至没有看到它的提及. (2认同)

mhu*_*mhu 61

虽然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>
Run Code Online (Sandbox Code Playgroud)

这意味着您不必指定DOM元素,甚至可以将多个模型绑定到同一个元素,如下所示:

<div>
  <input data-bind="value: VMA.name() + ' and ' + VMB.name()" />
</div>
Run Code Online (Sandbox Code Playgroud)

  • 您还可以使用"with"将页面区域分配给单个模型 - data-bind ="with:VMA" (4认同)
  • @flamingpenguin:是的,但是`with`并不便宜,请参阅:[link](http://www.knockmeout.net/2012/03/knockoutjs-performance-gotcha-1ifwith.html) (3认同)

Zig*_*oUK 7

我已经设法在运行时将自定义模型绑定到元素.代码在这里: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]);
Run Code Online (Sandbox Code Playgroud)