次の html のようなものがあります。
<table>
<tbody data-bind="foreach: { data: items, afterRender: alternateRowColor }">
<!-- ko if: isNew() -->
<tr>
<td><input data-bind="text: prop"/></td>
</tr>
<!-- /ko -->
<!-- ko if: !isNew() -->
<tr>
<td data-bind="text: prop"/></td>
</tr>
<!-- /ko -->
</tbody>
</table>
次のように定義されたオブジェクトのコレクションを使用します。
function NewItem() {
this.prop = ko.observable(0);
this.isNew = ko.observable(true);
}
function Item(prop) {
this.prop = prop;
this.isNew = ko.observable(false);
}
「アイテム」はサーバーからのもので、「NewItems」はユーザーがリンクをクリックすると追加されます。アイデアは単純に、新しいアイテムの入力ボックスを用意することですが、既存のアイテムを表示するだけです。これは、既存の項目 (isNew が false の場合) では問題なく機能するように見えますが、isNew が true の場合、両方のマークアップ セットがレンダリングされます (2 つの行が追加され、1 つが編集可能で、その後に 1 つの表示のみが続きます)。isNew が true の場合、最初の "tr" だけがレンダリングされると思います。ここで何が起こっているか知っている人はいますか?