1

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関数も含まれています。

4

1 に答える 1

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を参照してください

于 2012-10-27T01:35:22.830 に答える