KnockoutJS嵌套列表

时间:2012-12-18 10:12:01

标签: knockout.js knockout-2.0

我是KnockoutJS新手。

我有一个下面写的视图,无法在运行时看到每个类别的categoryVariables。 你能看看并说出这里有什么问题吗?

感谢您的帮助。

我的代码视图:

<table class="table">
    <thead>
    </thead>
    <tbody data-bind="foreach: categories">
        <tr>
            <td data-bind="text: Name">
                <table>
                    <tbody data-bind="foreach: categoryVariables">
                        <tr>
                            <td data-bind="text: Name"></td>
                        </tr>
                    </tbody>
                </table>
            </td>
            <td><button data-bind='click: $root.addCategoryVariable'>Add a category variable</button></td>
        </tr>
    </tbody>
</table>

<button data-bind='click: addCategory'>Add a category</button>

<script type="text/javascript">

    var resumeDataViewModel;

    function Category(data) {
        var self = this;

        self.ID = data.ID;
        self.Name = data.Name;

        self.categoryVariables = ko.observableArray([
            new CategoryVariable({ID: '1', Name: 'asd'})
        ]);
    }

    function CategoryVariable(data) {
        var self = this;

        self.ID = data.ID;
        self.Name = data.Name;
    }

    function ResumeDataViewModel() {
        var self = this;

        self.categories = ko.observableArray([
            new Category({ID: '1', Name : 'Contact', Category: {ID: '1', Name: 'gfdg'}}),
            new Category({ID: '2', Name : 'Education', Category: {ID: '2', Name: 'asdasd'}})
        ]);

        self.addCategory = function(){
            self.categories.push(new Category({
                Name: "sa d"
            }));
        }

        self.addCategoryVariable = function (category) {
            category.categoryVariables.push(new CategoryVariable({
                Name: 'asd'
            }));
        }
    }

    ko.applyBindings(resumeDataViewModel = new ResumeDataViewModel());
</script>

寻找你的回复。非常感谢你。

1 个答案:

答案 0 :(得分:3)

您的问题是绑定文本:名称,然后将表添加到同一个td。我已将categoryVariables的表移动到单独的TD,它工作正常。

由于你绑定了TD的文本,Ko的数据绑定将覆盖你内在的任何其他内容,只需设置来自observable的文本。 如果您正在查看不同的UI布局,请相应地更改您的HTML,但请记住以上内容。

还要在KO文档中检查无容器绑定的使用和with绑定。这些可以帮助您创建更好的HTML布局。

检查这个小提琴:http://jsfiddle.net/7BNQy/

修改HTML:

<table class="table">
<thead>
</thead>
<tbody data-bind="foreach: categories">
    <tr>
        <td data-bind="text: Name">

        </td>
        <td>
            <table>
                <tbody data-bind="foreach: categoryVariables">
                    <tr>
                        <td data-bind="text: Name"></td>
                    </tr>
                </tbody>
        </table></td>
        <td><button data-bind='click: $root.addCategoryVariable'>Add a category variable</button></td>
    </tr>
</tbody>
</table>

<button data-bind='click: addCategory'>Add a category</button>