Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 更新淘汰视图模型属性时触发更改事件_Javascript_Knockout.js - Fatal编程技术网

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

Javascript 更新淘汰视图模型属性时触发更改事件,javascript,knockout.js,Javascript,Knockout.js,下面是一个JSFIDLE来说明问题所在: 我试图在更新文本字段后触发更改事件。不幸的是,在subscribe方法中,文本框的值还没有更新,所以当我计算更改事件时,它被触发得太早了 我需要触发更改事件,因为我有依赖更改事件的第三方代码超出了我的控制范围 ko.bindingHandlers.valueAndFireChange = { update: function(element, valueAccessor) { var val = ko.unwrap(valueA

下面是一个JSFIDLE来说明问题所在:

我试图在更新文本字段后触发更改事件。不幸的是,在subscribe方法中,文本框的值还没有更新,所以当我计算更改事件时,它被触发得太早了

我需要触发更改事件,因为我有依赖更改事件的第三方代码超出了我的控制范围

ko.bindingHandlers.valueAndFireChange = {
    update: function(element, valueAccessor) {
        var val = ko.unwrap(valueAccessor());
        if (val == undefined) return;
        $(element).val(val);
        $(element).change();
    }
};

有什么建议吗?

一个简单的解决方案是将对$(“#text1”).change()的调用包装在一个超时为0的setTimeout中。这足以让knockout在调用jquery更改处理程序之前对textbox值进行(同步)更新

我用叉子叉起你的小提琴来演示:


如果这是您需要经常做的事情,更好的解决方案可能是将此行为包装在自定义绑定中,其中绑定的“更新”回调将在更新的元素上触发jquery更改事件。

b如果代码正确,则自定义绑定将执行此操作。虽然这个答案有点晚了,但这里有一个绑定,以防它能帮助后续阅读本文的人。它使用jQuery更新文本框的值——DOM现在被更新,以便Bob的第三方代码工作——因此,它触发更改事件

ko.bindingHandlers.valueAndFireChange = {
    update: function(element, valueAccessor) {
        var val = ko.unwrap(valueAccessor());
        if (val == undefined) return;
        $(element).val(val);
        $(element).change();
    }
};
以下是Bob's fiddle的更新版本,展示了这一点:


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

更改事件是在第三方代码中设置的,还是只需要调用它?更改事件处理程序绑定在第三方代码中,我需要在视图模型更新文本框值时触发它。也许我没有注意到您。如果您想要捕获新值(它被更改为的值),那么subscribe方法就可以了,并且在您的示例中它可以工作。由于我遗漏了一些东西,您期望的结果是什么?我希望在subscribe方法中,DOM已经被更新,这样我就可以触发输入字段的onchange事件,并在事件触发时设置新值。这不是一个理想的解决方案,但我不相信存在一个理想的解决方案,所以我认为这可能是我最好的选择。谢谢你的建议。