【问题标题】:How to keep this table from re-rendering rows如何防止此表重新呈现行
【发布时间】:2012-10-17 06:37:19
【问题描述】:

我有一张由 Knockout 渲染的表格

<table data-bind="visible: program">
    <thead>
        <tr>
            <td>Post</td>
            <td>Name</td>
            <td>Odds</td>
            <!--ko foreach: options -->
            <td data-bind="visible: value, text: name"></td>
            <!-- /ko -->
        </tr>
    </thead>
    <tbody data-bind="foreach: program() ? program().item: []">
        <tr>
            <td>
                <span data-bind="text: place"></span>
            </td>
            <td><span data-bind="text: name"></span></td>
            <td><span data-bind="text: odd"></span></td>

            <!--ko foreach: $parent.options -->
            <td data-bind="visible: value">
                <span data-bind="text: $parent[prop]"></span></td>
            <!-- /ko -->
        </tr>
    </tbody>
</table>

这个表是根据我拥有的一个可观察的(程序)呈现的。 '程序通过ajax调用更新,然后赋值(program(ko.mapping.fromJS(prg)))。

程序有一个项目数组,项目数量大小不一,但每个项目总是有需要的字段。

我想有一种方法可以设置它,以便 Knockout 只渲染新事物。

例如,如果我当前的程序中有 6 个项目,它会创建一个有 6 行的表,如果我得到一个不同的程序,其中也有 6 个项目,那么表实际上不应该重新渲染表,只需使用什么已经在那了。如果那时我有一个 7 项程序,它只会呈现它需要的单行。如果有 5 个项目出现在一个之后,它会简单地删除它不使用的 2 个

这听起来可能吗?还是我不在基地? ** 为了方便起见,我上面的示例也被简化了,该表还包含一些 ko.computed 函数。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    我的repeat 绑定就是这样做的。它只在数组变大时渲染新行:

    <tbody>
        <tr data-bind="repeat: program() ? program().item: []">
            <td>
                <span data-bind="text: $item().place"></span>
            </td>
            <td><span data-bind="text: $item().name"></span></td>
            <td><span data-bind="text: $item().odd"></span></td>
    
            <!--ko foreach: options -->
            <td data-bind="visible: value">
                <span data-bind="text: $item()[prop]"></span></td>
            <!-- /ko -->
        </tr>
    </tbody>
    

    https://github.com/mbest/knockout-repeat

    【讨论】:

    • 这看起来很有趣,很有前途,肯定会考虑使用它,但是为了知识,我不能用普通的标准绑定集来完成这个吗?
    • 我通过删除/替换 $parent 引用修复了内部 foreach 的问题。这是因为 repeat 绑定不会创建子上下文。
    • 您可以尝试使用foreach。像foreach: ko.utils.range(0, program() ? program().item.length-1 : 0) 这样的东西。然后foreach 中的$data 将是索引。因此,您可以使用 $parent.program().item[$data].place 访问数组中的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2011-01-12
    • 2020-11-04
    相关资源
    最近更新 更多