0

我正在处理一些自定义绑定,其中一个我希望能够从一些字符串数组中显示一个表格。

小提琴

我将其简化为这个自定义绑定:

ko.bindingHandlers.table = {
    init: function tableBinding(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

        element.innerHTML = tableTemplate;

        var innerBindingContext = bindingContext.createChildContext(valueAccessor());

        ko.applyBindingsToDescendants(innerBindingContext, element);

        return {
            controlsDescendantBindings: true
        };
    }
};

这是模板的内容:

<!-- if: head && head.length -->
<thead>
<tr data-bind="foreach: head">
    <th data-bind="text: $rawData">not working th</th>
</tr>
</thead>
<!-- /ko -->

<tbody data-bind="foreach: rows">
<tr data-bind="foreach: $data">
    <td data-bind="text: $data">not working td</td>
</tr>
</tbody>

还有一些示例数据。

ko.applyBindings({
    table: {
        head: ["Name", "Position"],
        rows: [
            ["John", "Janitor"],
            ["Mike", "IT"],
            ["Paul", "HR"],
            ["Rick", "Coffee Fetcher"]
        ]
    }
});

我正在使用 Knockout 3.0,但是任何可以在 Knockout 2.x 上工作的东西也可以在这里工作。如果您查看小提琴,则该<thead>部分显示正确,但主体的绑定却没有。如果我内联模板并使用with绑定(如with: table.

4

1 回答 1

4

我必须承认,目前我并没有关注你在这里所做的一切,但我可​​以告诉你,如果你的if语句使用ko if:而不是 just ,你的例子就会起作用if:

http://jsfiddle.net/AhLzS/1/

所以代替这个:

<!-- if: head && head.length -->

跟着这个:

<!-- ko if: head && head.length -->

无容器绑定语法需要<!-- ko ... --> ... <!-- /ko -->作为虚拟容器。因此,如果 html 注释语法只有<!-- if ... -->,则 knout 不会做任何特别的事情。

来自“if”绑定的淘汰赛文档:http:
//knockoutjs.com/documentation/if-binding.html

和注释充当开始/结束标记,定义包含内部标记的“虚拟元素” <!-- ko --><!-- /ko -->Knockout 理解这种虚拟元素语法并像拥有真正的容器元素一样进行绑定。

于 2013-11-10T03:55:20.543 回答