【发布时间】:2012-07-02 13:46:44
【问题描述】:
我遇到了敲除“已检查”绑定的问题。似乎复选框处的“更改”事件在更新之前返回旧值(因此,如果未选中,它将返回 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 被更改时,它总是发送旧值、触发方法,然后更改值。有没有办法解决这个问题?
【问题讨论】:
-
您的代码有问题。
ShowOpened和IsUpdated都不是 ko.observables(可能这就是为什么你总是得到旧值的原因)。这段代码怎么能工作?CategoryChange应该抛出异常。 -
@freakish 你说得对,我最初创建这篇文章时犯了一个错误。但是您指出的错误仍然不是问题。
-
喂,还是错过了这个:
this.ShowOpened = ko.observable(ShowOpened);和这个:pCategory.ShowOpened()。我必须说,你在写这篇文章时犯了很多错误......