Data binding 如何停止对子元素求值的knockout.js绑定

Data binding 如何停止对子元素求值的knockout.js绑定,data-binding,knockout.js,elements,Data Binding,Knockout.js,Elements,使用knockout,当调用ko.applyBinding(viewModel,“divId”)时,它通过绑定到的元素(“divId”)的子元素进行递归绑定。我想在子节点停止此计算。有办法做到这一点吗 为什么 我想将整个页面绑定到导航视图模型,这将处理基本布局和…微笑。。。航行在不同的页面上,我想将某些区域绑定到不同的视图模型,这些视图模型不是导航视图模型的属性。此时,如果我这样做,就会出现“无法解析绑定”错误,因为导航视图模型没有所需的属性。如果我可以停止在dom中进行绑定,我可以单独绑定这些

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

为什么


我想将整个页面绑定到导航视图模型,这将处理基本布局和…微笑。。。航行在不同的页面上,我想将某些区域绑定到不同的视图模型,这些视图模型不是导航视图模型的属性。此时,如果我这样做,就会出现“无法解析绑定”错误,因为导航视图模型没有所需的属性。如果我可以停止在dom中进行绑定,我可以单独绑定这些项。

我这样做的一种方法是为导航创建一个节(或仅创建一个节),并将navVM绑定到它。然后为内容创建另一个部分,并将contentVM绑定到该部分。这样就不会有冲突,也就完全分离了

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


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

有几种方法可以执行此操作。通常,您会将多个“子”视图模型添加到主视图模型中,然后在具有实际视图模型的各个区域上使用带绑定的

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

ko.bindingHandlers.stopBindings = {
    init: function() {
        return { controlsDescendantBindings: true };
    }  
};
当您将其放置在元素上时,KO将忽略子元素。然后,可以使用不同的视图模型对该元素的子元素调用ko.applyBindings

样本:


通常情况下,您会在一个主视图模型下使用带有绑定的
使用多个视图模型。

mmm…遗憾的是,要创建位于同一个子目录下的两个单独的绑定上下文并不容易,您“可以”做到这一点(参见Ryan的注释),我只是说,将组件看作是它们自己的松散耦合模块可能更具结构化。非常好的东西,正是我想要的。我的场景可能并不典型,但它为我提供了一种真正的基于模块的加载方法,其中每个模块独立于所有其他模块,使测试变得有趣……这迫使使用额外的容器来停止绑定;让无容器(注释)节点支持自定义绑定处理程序(如上述StopBinding)是否容易?它将在高度模块化的应用程序中非常有用:)在2.1(在RC中)中,无容器的自定义绑定处理程序可能类似:。所以,这不会有问题。在2.0中,
ko.virtualElements.allowedBindings
未公开。我在控件搜索绑定方面遇到问题。为什么不在foreach中绑定子列表?当我在代码中执行类似操作时,foreach绑定由父级处理,而不管从bindingHandler init函数返回controlsDescentBindings:true。