アプリケーションコードで経験していることを大まかに説明するjsfiddleがあります。(後世のために、実際のフィドルコードを以下に投稿します。)
基本的に、チェックボックス オプションのリストを設定するために使用されている監視可能な配列が 1 つあります。オプションの 1 つを選択すると、選択された項目だけで構成される別の監視可能な配列にその項目が追加されます。
フォームに何らかのエラーがある場合 (または、既存のデータを編集していると思われます)、選択された監視可能な配列には、以前に選択された項目が最初から入力されます。ただし、現在、元のアイテムと選択されたアイテムの間に接続がないため、チェックボックスのいずれかをオンまたはオフにすると、重複が追加され、その重複が削除されるだけです。
私の質問は、1)これについて完全に間違っているのでしょうか(つまり、この問題を引き起こさないより良い方法はありますか)、2)そうでない場合、アイテム間の接続を復元する最良の方法は何ですか。チェックボックスはアイテムがそこにあることを示し、チェックを外すとアイテムが削除されますか?
HTML
<ul data-bind="foreach: Fruit">
<li>
<label>
<input type="checkbox" class="cbFruit" data-bind="checked: Selected, attr: { value: Name }" />
<span data-bind="text: Name"></span>
</label>
</li>
</ul>
<ul data-bind="foreach: SelectedFruit">
<li data-bind="text: Name"></li>
</ul>
JS
var FruitViewModel = function (name) {
var self = this;
self.Name = ko.observable(name);
self.Selected = ko.observable(false);
return self;
};
var GroceryStoreViewModel = function () {
var self = this;
self.Fruit = ko.observableArray([
new FruitViewModel('Apples'),
new FruitViewModel('Oranges'),
new FruitViewModel('Bananas'),
new FruitViewModel('Pineapples')
]);
self.SelectedFruit = ko.observableArray([
new FruitViewModel('Oranges'),
new FruitViewModel('Bananas')
]);
return self;
};
$(document).ready(function () {
var viewModel = GroceryStoreViewModel();
ko.applyBindings(viewModel);
$('.cbFruit').on('click', function () {
var fruit = ko.dataFor(this);
if (fruit.Selected()) {
viewModel.SelectedFruit.push(fruit);
} else {
viewModel.SelectedFruit.remove(fruit);
}
});
});