ノックアウトの「チェック済み」バインディングに問題があります。チェックボックスの「変更」イベントは、更新される前に古い値を返すようです(したがって、チェックされていない場合はfalseが返されます)。オブジェクト内にあるので、値をサブスクライブできないと思います。
<tbody data-bind="foreach: Categories">
<tr>
<td><input type="checkbox" data-bind="checked: ShowOpened, event: { change: $root.CategoryChange }" /></td>
</tr>
</tbody>
<script type="text/javascript">
var Category = function (Id, Name, Order, ShowOpened) {
this.Id = Id;
this.Name = Name;
this.Order = Order;
this.ShowOpened = ShowOpened;
this.IsUpdated = ko.observable(false);
this.OldOrder = Order;
this.OldShowOpened = ShowOpened;
};
var ViewModel = {
Categories: ko.observableArray([]),
CategoryChange: function(pCategory) {
if(pCategory.Order != pCategory.OldOrder || pCategory.ShowOpened != pCategory.OldShowOpened)
pCategory.IsUpdated(true);
else
pCategory.IsUpdated(false);
}
};
ko.applyBindings(ViewModel);
</script>
したがって、この例では、オブジェクト内の変数を変更するCategoryChangeメソッドをトリガーできるShowOpenedチェックボックスがあります(後でどのオブジェクトが更新されるかを知る必要があります)。ただし、チェックボックスが変更されると、常に古い値、トリガーメソッドが送信され、値が変更されます。これを修正する方法はありますか?