ショッピングカートの例を見てみましょう...
ユーザーがアイテムを選択するたびに、カートの行に移動します。
/* would normally autoincrement */
var num = '1';
document.getElementById('cart').innerHTML = oldHTML +
"<div id='line" + num + "'>
<input type='text' data-bind='value: quantity'>
<input type='text' data-bind='value: price'>
<input type='text' data-bind='value: extendedPrice'>
</div>";`
var lineVM () {
var self = this;
self.quantity = ko.observable();
self.price = ko.observable();
self.extendedPrice = ko.computed(function () {return self.price() * self.quantity();});
}
ko.applyBindings(new lineVM(), document.getElementById('line' + num));
行が追加されると、行 1、行 2 などがあります...
ドキュメントから:
必要に応じて、2 番目のパラメーターを渡して、データ バインド属性を検索するドキュメントの部分を定義できます。たとえば、ko.applyBindings(myViewModel, document.getElementById('someElementId')) です。これにより、アクティブ化が ID someElementId とその子孫を持つ要素に制限されます。これは、複数のビュー モデルを持ち、それぞれをページの異なる領域に関連付ける場合に便利です。
テストでは、分離がないことが示されています...ビューモデルを再利用すると、別の行を追加すると、その前の行が「空白」になります。ただし、不確定な行数に対して同じビューモデルが必要です。潜在的な行ごとに 100 個のビュー モデルを作成したくありません。また、101 個のアイテムを持つ予定の顧客のためにカートを壊したくありません。
では、単一のビュー モデルがあり、それをページ上の複数の領域に関連付けたい場合はどうすればよいでしょうか? ドキュメントは実際には言いません。Knockout で許可されていないことをしようとしていますか?
ご助力ありがとうございます。