【问题标题】:knockout foreach binding not working when viewmodel used as a sub-view-model wizard style dialog当视图模型用作子视图模型向导样式对话框时,淘汰 foreach 绑定不起作用
【发布时间】:2015-01-15 00:57:15
【问题描述】:

我正在创建一个包含多个子视图模型的向导。

一个view-model (step 3) is a copy of this knockout form and consists of two radio button groups,其中第一组控制第二组中可用的选项。

在此子视图中使用时,我无法绑定单选按钮,虽然它作为独立的视图模型工作,但在用作子视图时,似乎永远不会调用 self.availableDatabases ko.computed 函数(或者换句话说,视图似乎没有绑定到视图模型)。

select db 单选组通过以下代码绑定到子视图模型 availableDatabases:

<h1>Select OS:</h1>
<div data-bind="foreach: os" >
    <div>
        <input type="radio" name="os" data-bind="attr: {value: name}, checked: $root.selectedOs" />
        <span data-bind="text: name"></span>
    </div>    
</div>
<h1>Select DB:</h1>
<div data-bind="foreach: availableDatabases" >
    <div>
        <input type="radio" name="db" data-bind="attr: {value: name}, checked: $root.selectedDb" />
        <span data-bind="text: name"></span>
    </div>    
</div>

The fiddle for the entire wizard code is here,您知道我在与子视图模型的集成中做错了什么吗?

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    您需要使用$parent 而不是$root

    $root 引用您的主视图模型,您在您的案例 ViewModel 中通过 applyBindings 调用,但您的 ConfigureModel 上具有 selectedOsselectedDb 属性。

    因此,您需要在 foreach 中使用 $parent“上一层”来访问您的属性(或者您可以使用 $root.configureModel().selectedOs 一直到顶部并下一层到您的 configureModel )

    <h1>Select OS:</h1>
    <div data-bind="foreach: os" >
        <div>
            <input type="radio" name="os" data-bind="attr: {value: name}, 
                   checked: $parent.selectedOs" />
            <span data-bind="text: name"></span>
        </div>    
    </div>
    <h1>Select DB:</h1>
    <div data-bind="foreach: availableDatabases" >
        <div>
            <input type="radio" name="db" data-bind="attr: {value: name}, 
                   checked: $parent.selectedDb" />
            <span data-bind="text: name"></span>
        </div>    
    </div>
    

    演示JSFiddle.

    您可以在documentation 中了解这些绑定上下文属性。

    【讨论】:

    • 好的,非常感谢您的帮助 - 现在效果很好。最后一个查询,如何选择单选选项的第一个元素,以便始终选择该选项(即 Windows Standard,第一个选项,在视图加载时始终被勾选)?
    • 你可以只为你的 selectedOs observable 设置一个默认值:self.selectedOs = ko.observable(self.os[0].name);
    • 对不起@nemsev 无法弄清楚,当操作系统发生变化时,如何将 selectedDb 设置为第一个选项,您能否指出正确的方向,我得到过滤后的数据库列表,但不知道如何设置值,我是否应该使用 thr sku 或名称。
    • 您需要订阅 availableDatabases 计算的更改。在更改处理程序中,您可以设置 selectedDb jsfiddle.net/SMUSv 请注意,我已将 selectedOs 的默认值设置移动到订阅之后,以便为初始选择工作。
    猜你喜欢
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多