我在 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/