1

ノックアウトは、切り離された要素のバインディングを破壊するようです。したがって、バインディングを適用してその要素をデタッチすると、要素がデタッチされている間にそのバインディングが計算されないだけでなく、要素がドキュメントに再挿入された後もバインディングが壊れます。

次のようなものです:

ko.applyBindings(items, $list[0]);

items.push('one');

$list.detach();

items.push('two');

$container.append($list);

items.push('three');

ここにフィドルがあります:http://jsfiddle.net/nicholasstephan/KejYc/2/

$list のバインドは 1、2、3 と読む必要がありますが、デタッチ後のすべての更新は計算されません。

これを機能させるには、ここで何をすべきですか?

4

1 に答える 1

1

最後にバインディングを適用すると、フィドルが機能します。しかし、私はそれがあなたが狙っているものだとは思いません:

var $container = $("#container");
var $list = $('#list');
var items = ko.observableArray([]);

items.push('one');
$list.detach();
items.push('two');
$container.append($list);
items.push('three');
ko.applyBindings(items, $list[0]);

このSOスレッドは、デタッチするたびにバインディングを再適用するか、要素をデタッチする代わりに単に非表示にすることを提案しています。この場合、アプローチを再考することを示唆するコメントもいくつかありますが、これが最良の答えのようです。

おそらく、不自然な例ではなく、目的の動作を提供できますか?それはおそらく代替モデルを提案するのに大いに役立つでしょう。あなたの目標がドラッグ可能な要素を作成することであると仮定すると(カフから離れて、それは私が要素を切り離す/再挿入する必要がある唯一の本当にありそうなシナリオです)、あなたは次のようなアプローチを取ることができます:

  1. ドラッグ開始
  2. 要素のコピーをドラッグします(ドキュメントに元の状態を残します)
  3. ドラッグが停止しました
  4. 必要なデータを元のデータからコピーする
  5. コピーした要素を新しい/有効な場所に挿入します
  6. 古い要素を削除します
  7. 新しい要素でko.applyBindingsを呼び出します
于 2012-11-26T00:56:25.920 に答える