这是一个 jsfiddle 来显示问题所在:
http://jsfiddle.net/boblauer/BgvV4/
我试图在更新文本字段后触发更改事件。不幸的是,在 subscribe 方法中,文本框的值还没有更新,所以当我计算出 change 事件时,它被触发得太快了。
我需要触发更改事件,因为我有不受我控制的依赖于更改事件的第 3 方代码。
有什么建议么?
这是一个 jsfiddle 来显示问题所在:
http://jsfiddle.net/boblauer/BgvV4/
我试图在更新文本字段后触发更改事件。不幸的是,在 subscribe 方法中,文本框的值还没有更新,所以当我计算出 change 事件时,它被触发得太快了。
我需要触发更改事件,因为我有不受我控制的依赖于更改事件的第 3 方代码。
有什么建议么?
一个简单的解决方案是将您对 $("#text1").change() 的调用包装在一个超时为 0 的 setTimeout 中。这足以让敲除在 jquery 更改处理程序获取之前对文本框值进行(同步)更新调用。
我叉了你的小提琴来演示:http: //jsfiddle.net/SuRYa/1//
如果这是您需要做的很多事情,更好的解决方案可能是将此行为包装在自定义绑定中,其中绑定的“更新”回调将触发更新元素上的 jquery 更改事件。
bmode 是对的,自定义绑定就可以了。虽然这个答案有点晚了,但这里是绑定,以防它帮助任何人随后阅读这篇文章。它使用 jQuery 更新文本框的值——现在更新了 DOM 以使 Bob 的第 3 方代码能够工作——因此它触发了 change 事件。
ko.bindingHandlers.valueAndFireChange = {
update: function(element, valueAccessor) {
var val = ko.unwrap(valueAccessor());
if (val == undefined) return;
$(element).val(val);
$(element).change();
}
};
这是鲍勃小提琴的更新版本,显示了这一点:
我将警报更改为 console.log,因此您需要打开控制台才能看到有用的信息。