我在 knockout “选中”的绑定(bind)时遇到问题。似乎复选框中的“更改”事件在更新之前会返回旧值(因此,如果未选中它会返回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>

因此,在此示例中,我具有ShowOpened复选框,该复选框可以触发CategoryChange方法,该方法将更改对象内部的变量(稍后需要知道要更新的对象)。但是,更改chechbox时,它始终会发送旧值,触发方法,然后再更改该值。有没有什么办法解决这一问题?

最佳答案

由于您一直坚持说缺少ko.observables并不是问题,因此我仔细研究了一下。看来你是对的!在设置实际值之前,在之前触发触发change事件。恐怕我不知道原因。

但是有一种简单的方法可以解决此问题:只需将change事件更改为click事件:

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

请记住,您必须在return true;事件处理程序的末尾显式放置click。否则,新值将不会设置为复选框。

如果您不想使用click事件,则可以使用其他方法。订阅ShowOpened的更改:
this.ShowOpened = ko.observable(ShowOpened);
this.ShowOpened.subscribe(function(newValue) {
    /* Do something when ShowOpened changes.
       newValue variable holds the new value, obviously. :) */
});

关于knockout.js - knockout 复选框更改事件发送旧值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11294992/

10-17 02:50