【问题标题】:knockout js foreach not working with child collection淘汰赛js foreach不适用于子集合
【发布时间】:2013-03-08 06:18:47
【问题描述】:

我有一个模型,我从 json 数据映射,它基本上包含一个类别列表,每个类别中都有一个控件列表...所以,在我的 UI 中,我有一个包含类别列表的面板当用户单击它时,我将整个类别推送到(在加载时)空的可观察对象以在另一个面板中呈现...单击功能似乎正在工作,但使用 foreach 在我的第二列中没有呈现任何内容陈述。任何帮助,将不胜感激。我的 json 数据有点长,所以最好在这里参考我的小提琴:

http://jsfiddle.net/TU3ps/4/

但这是我试图教孩子的方式,我的语法在这里不好吗?

        <div class="left">Click any of the below categories to see its controls...
            <ul data-bind="foreach:  Categories">
                <li data-bind="click:  $parent.catClick"> 
                    <span data-bind="text:  Text"></span>
                </li>
            </ul>
        </div>
        <div class="right">Controls within the category clicked...
            <ul data-bind="foreach:  Curr.Ranges">
                <li>
                    <span data-bind="text:  FieldName" />
                </li>
            </ul>
        </div>

我应该这样做有更好的方法吗?基本上,我希望我的右侧面板一次只显示一个集合。我现在要做的就是显示字段名,但没有显示任何内容。任何帮助将不胜感激....

【问题讨论】:

    标签: knockout.js


    【解决方案1】:

    看起来你希望 Curr 是一个 observable,而不是 observableArray,而且你没有正确分配它:

    viewModel.Curr = ko.observable();
    // Inside your click method
    viewModel.Curr(category);
    

    您还需要添加 Ranges 的虚拟属性,否则会在初始 applyBindings 上炸毁:

    viewModel.Curr = ko.observable({ Ranges: [] });
    

    【讨论】:

    • 您的意思是在您的小提琴中,还是在本地代码中?因为您的小提琴正在使用 raw.github 上的映射插件,由于 mime 类型问题(我认为),它不会在浏览器中加载,所以您需要使用 //cdnjs.cloudflare.com/ajax/libs/ knockout.mapping/2.3.5/knockout.mapping.js 我已经更新了你的小提琴,它至少运行没有任何错误:jsfiddle.net/manzanotti/TU3ps/11
    • 谢谢,成功了。我也错过了:viewModel.Curr = ko.observable({ Ranges: [] }); ....
    • 哦,是的,忘了我必须添加它以阻止它在初始绑定时爆炸。
    • 为了完整起见,我现在已将其添加到答案中。
    • 更新了你的小提琴。 jsfiddle.net/sujesharukil/TU3ps/23 基于 Paul 的 cmets。
    猜你喜欢
    • 2014-08-05
    • 2013-03-30
    • 2020-06-22
    • 2018-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    • 2013-01-13
    相关资源
    最近更新 更多