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