如何使用knockout绑定表中的内部数组

时间:2013-07-01 16:11:18

标签: xml xslt knockout.js

更新:我似乎忘记了最重要的信息。这不是在html文件中,而是在xsl文件中。 ko注释标签被剥离,这就是“名称”不存在的原因。我将Damien的回答标记为答案,让他因为前往JSFiddle而引导我走向正确的方向。感谢。

原始问题:

有没有办法用knockout.js绑定表中JSON对象的内部数组?我尝试了很多不同的方法,但似乎都没有。有两个类似的问题:

Knockout Array of Arrays

Binding Nested Array Using Knockout foreach

但是,在这两种情况下,他们都在使用容器绑定。我需要使用无容器绑定,这似乎不起作用。

这是一个简化的代码示例:

var reportData = {[
    "Category": "First Category", 
    "Id": 1, 
    "Items": [
        {"Name": "First Name"},
        {"Name": "Second Name"}
        ]
    }, {
    "Category": "Second Category",
    "Id": 2,
    "Items": [
        {"Name": "First Name"},
        {"Name": "Second Name"}
        ]
    }];

绑定代码是基本的(摘录):

var viewModel = function() {
        var self = this;
        self.reportData = ko.observableArray();
    }

var vm = new viewModel();
vm.reportData(data);
ko.applyBindings(vm);

我需要的是:

<tbody data-bind="foreach: reportData">
    <tr>
        <td data-bind="text: Category"></td>
    </tr>
    <!-- ko foreach: Items -->
    <tr>
        <td data-bind="text: Name"></td>
    </tr>
    <!-- /ko -->
</tbody>

我尝试了很多不同的方法来获取内部数组数据,但我总是得到“Name”未定义的错误。我在控制台中确认我正在获取正确的数据,并且外部对象数组值显示没有问题。

访问此内部数组的正确方法是什么,并在内部数组的无容器绑定表中显示?

1 个答案:

答案 0 :(得分:2)

请你看看this fiddle并告诉我什么不起作用。 因为对我来说它运作良好。

查看:

<table>
    <tbody data-bind="foreach: reportData">
        <tr>
            <td data-bind="text: Category"></td>
        </tr>
        <!-- ko foreach: Items -->
        <tr>
            <td data-bind="text: Name"></td>
        </tr>
        <!-- /ko -->
    </tbody>
</table>

JS:

data =  [{
        "Category": "First Category",
            "Id": 1,
            "Items": [{
            "Name": "First Name"
        }, {
            "Name": "Second Name"
        }]
    }, {
        "Category": "Second Category",
            "Id": 2,
            "Items": [{
            "Name": "First Name"
        }, {
            "Name": "Second Name"
        }]
    }]
;


var viewModel = function () {
    var self = this;
    self.reportData = ko.observableArray();
}

var vm = new viewModel();
vm.reportData(data);
ko.applyBindings(vm);