如何阻止knockout.js绑定评估子元素

时间:2012-02-13 01:45:05

标签: data-binding knockout.js elements

使用knockout,当你调用ko.applyBinding(viewModel, "divId")时,它会通过你绑定的元素(“divId”)的子元素进行递归绑定。我想在子节点停止此评估。有没有办法做到这一点?

之所以......

我想将整个页面绑定到导航视图模型,这将处理基本布局和...微笑...导航。在各个页面上,我想将某些区域绑定到不是导航视图模型属性的不同视图模型。目前,如果我这样做,我得到“无法解析绑定”错误,因为导航视图模型没有所需的属性。如果我可以阻止绑定走下dom,我可以单独绑定这些项目。

2 个答案:

答案 0 :(得分:37)

您可以通过多种方式继续使用此方法。通常,您可以将多个“子”视图模型添加到主视图模型,然后使用实际视图模型的各个区域上的with绑定来绑定它们。

技术上可以做你想做的事。您可以创建一个自定义绑定,告诉KO它将处理绑定子项本身。它看起来像是:

ko.bindingHandlers.stopBindings = {
    init: function() {
        return { controlsDescendantBindings: true };
    }  
};

当你把它放在一个元素上时,KO会忽略这些孩子。然后,您可以使用不同的视图模型在此元素的子节点上调用ko.applyBindings。

示例:http://jsfiddle.net/rniemeyer/tWJxh/

通常情况下,您可以使用with绑定在主视图模型下使用多个视图模型。

答案 1 :(得分:3)

我这样做的一种方法是为导航(或只是a)创建一个部分并将navVM绑定到它。然后为内容创建另一个部分并将contentVM绑定到它。这样就没有冲突,而且一切都很分开。

<body>
    <div id="navSection">
    </div>
    <div id="contentSection">
    </div>
</body>

然后执行ko.applyBinding(navVM,“navSection”)和ko.applyBinding(contentVM,“contentSection”)