首页 文章

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

提问于
浏览
251

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

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

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

4 回答

  • 427

    虽然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>
    
  • 60

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

    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 ,因为你会得到多个事件处理程序 .

  • 0

    你应该看一下 with 绑定,以及 controlsDescendantBindings http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html

相关问题