Knockout checkbox change event sends old value

knockout-2.0, knockout.js

Solution

Since you persisted on stating that the lack of `ko.observables` is not an issue, I've looked at it closer. It seems, that you are correct! The `change` event is fired before the actual value is set. I'm afraid I do not know the reason for this.

But there is an easy way to fix this: just change `change` event to `click` event:

<input type="checkbox" data-bind="checked: ShowOpened, click: $root.CategoryChange" />

Remember, that you have to explicitly put `return true;` at the end of `click` event handler. Otherwise the new value won't be set to checkbox.

If you do not want to use `click` event, then you can do it the other way. Subscribe to changes of `ShowOpened`:

this.ShowOpened = ko.observable(ShowOpened);
this.ShowOpened.subscribe(function(newValue) {
    /* Do something when ShowOpened changes.
       newValue variable holds the new value, obviously. :) */
});

Problem

I'm having a problem with knockout "checked" binding. It seems that "change" event at checkbox return old value, before it is updated(so if it was unchecked it will return false). I don't think that I can subscribe to the value since I have it inside object. ``` <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> ``` So in this example I have ShowOpened checkbox that can trigger CategoryChange method that will change a variable inside object(that I need later to know what object are updated). But when the chechbox is changed it always send out the old value, triggering method, and then changes the value. Is there any way to fix this?

Original source