2015-04-29 96 views
2

我有一个使用knockout.js的表单,其中用户可以输入值,然后单击按钮或按回车以将值应用于当前虚拟机。在Knockout.js中输入未知输入输入处理程序

一切正常,当我点击输入字段的按钮或标签之前,我按下输入,但如果我按下输入没有标签输入字段,我正在阅读过时值(或没有值,如果字段有还没有失去焦点)。

 self.triggerApplyInputByEnter = function (data, event) { 
      if (event.keyCode === 13) { 
       self.ApplyInput(); 
       return false; 
      } 
      return true; 
     }  

标记:

    <table> 
        <tbody data-bind="foreach: Inputs"> 
        <tr> 
         <td><input type="text" placeholder="Start" data-bind="value: InputStart, event: { keypress: $parent.triggerApplyInputByEnter }" /></td> 
         <td><input type="text" placeholder="End" data-bind="value: InputEnd, event: { keypress: $parent.triggerApplyInputByEnter }" /></td> 
        </tr> 
        </tbody> 
       </table> 
       </td> 
      <td> 
       <a href="#" title="" data-bind="click: ApplyInput" ><span>Apply Input</span></a> 
      </td> 

我的直觉是,不被更新了我的观测绑定到我的输入字段,直到输入字段失去焦点。任何有关如何读取按键处理程序中未提交值的指导,或者当我按Enter键时按Enter或以任何其他方式读取最新值时强制输入字段为数据绑定?我发现使用“valueUpdate:'afterkeydown'”的作用在于它使用每个按键都更新了observable,如果输入大量数据,这看起来效率不高,但对于我的情况来说已经足够好了。

<td><input type="text" placeholder="Start" data-bind="value: InputStart, valueUpdate:'afterkeydown', event: { keypress: $parent.triggerApplyInputByEnter }" /></td> 
+0

我不是100%确定这会解决你的问题,但你看[hasFocus](http://knockoutjs.com/documentation/hasfocus-binding.html)绑定?我从来没有遇到过你的问题,但我们可能会从那里开始,除非你想制作一个[JSFiddle](http://jsfiddle.net/)。 –

回答

2

textInput绑定是为实时跨浏览器更新而设计的。这将用于你的用例。

valueUpdate: 'afterkeydown'"绑定可能在许多场景中失败,如移动。

+0

很好,谢谢 – Stanley