更新淘汰视图模型属性时触发更改事件

时间:2012-07-26 14:56:10

标签: javascript knockout.js

这是一个解决问题的方法:

http://jsfiddle.net/boblauer/BgvV4/

我正在尝试在更新文本字段后触发更改事件。不幸的是,在subscribe方法中,文本框的值尚未更新,因此当我计算更改事件时,它很快就会被激活。

我需要触发更改事件,因为我的第三方代码不受我的控制,依赖于更改事件。

有什么建议吗?

2 个答案:

答案 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();
    }
};

这是鲍勃小提琴的更新版本,显示了这一点:

http://jsfiddle.net/BgvV4/17/

我将警报更改为console.log,因此您需要打开控制台才能看到有用的信息。