KnockoutJS:如何在用户copy'n'paste到文本字段后更新视图模型?

时间:2012-06-19 20:58:32

标签: javascript html knockout.js

我正在开发一个网站,用户在输入文本框中输入一些文字后自动填充表格中的搜索结果(类似于谷歌即时搜索)。

当用户通过添加

输入信息时,我设法获得淘汰赛js来更新视图模型

valueUpdate: 'afterkeydown'

进入我的数据绑定属性,但是,我还需要处理用户右键单击并将一些文本粘贴到文本框中的情况,所以我尝试了:

valueUpdate: ['afterkeydown','mouseup']

但是这不起作用,当我尝试通过视图模型读取文本框的值时我一直得到旧值,直到我从输入文本框中删除

任何人都知道如何解决这个问题?

的奥斯卡

2 个答案:

答案 0 :(得分:27)

您可以使用valueUpdate:'input'。我测试它可以在Opera,Firefox和Chrome中使用。我在Linux机器上,所以我无法在IE中测试它。 Check this fiddle

更新:我现在在IE8中测试它,它不起作用。但使用以下似乎可行。

valueUpdate:['afterkeydown','propertychange','input']

感谢Michael Best对此发表评论:)我已更新the fiddle

UPDATE okt 2014:正如kzh在下面的评论中提到的,在Knockout.js的更高版本之一中添加了textInput绑定。此绑定处理此方案并构建了浏览器怪癖处理 http://knockoutjs.com/documentation/textinput-binding.html

答案 1 :(得分:10)

新方式

而不是:

data-bind="value: myValue, valueUpdate: ['input', 'textchange']"

现在可以使用textInput binding

data-bind="textInput: myValue"

来自文档:

  

textInput绑定将文本框(<input>)或文本区域(<textarea>)与viewmodel属性链接,提供viewmodel属性和元素值之间的双向更新。与value绑定不同,textInput为DOM提供所有类型用户输入的即时更新,包括自动完成,拖放和剪贴板事件。

旧路

valueUpdate: ['afterkeydown','propertychange','input']
如果你想支持 RightMouseClick 删除 RightMouseClick 剪切

在IE9中不起作用。< / p>

我提出的解决方案涉及使用jQuery和一个名为jQuery Splendid Textchange的jQuery插件。加载jQuery和插件脚本后,您可以愉快地使用'textchange'事件。

valueUpdate: 'textchange'

但是,我可能有一天会停止支持糟糕的浏览器,所以我有这个:

valueUpdate: ['input', 'textchange']

这是我为测试此事件和其他事件而制作的小提琴:http://jsfiddle.net/kaleb/w3ErR/

N.B。如果你正在使用requirejs,jquery可能必须是淘汰赛的硬依赖,才能使其始终正常工作。