これは、次の問題を示すjsFiddleです。
(観察可能な) 文字列のリストに対する foreach バインディングが与えられた場合、観察可能要素は、foreach 内でバインドされた入力タグへの変更から更新されないように見えます。期待するだろう。jsFiddle の例を次に示します。
HTML
<ul data-bind='foreach: list'>
<li><input data-bind='value: $data'/></li>
</ul>
<ul data-bind='foreach: list'>
<li><span data-bind='text: $data'></span></li>
</ul>
Javascript
var vm = { list: [ko.observable('123'), ko.observable('456')] };
ko.applyBindings(vm);
上記の例では、最初のリストの入力タグを更新すると、オブザーバブルが更新されることが予想されます。残念ながら、2 番目のリストが最初のリストに加えられた変更を反映していないことからわかるように、期待どおりに更新されません。
入力要素が変更されたときにリストが実際に更新されていないことを確認しました。興味深いことに、オブザーバブルに加えられた変更は両方のリストに反映されます (予想どおり)。つまり、vm.list[1]("444")
両方のリストの 2 番目の要素を更新します。
私の記憶では、Knockout 2.0.0 にはこの問題はありませんでしたが、修正する必要があります。これが機能しない理由や期待される結果を達成する方法についての兆候を示すドキュメント、Google、またはノックアウト コードのコメントは見つかりませんでした。
これが期待どおりに機能しないのはなぜですか? また、データ構造を変更する必要のない回避策はありますか?