使用knockout和javascript函数输入key enable

使用knockout和javascript函数输入key enable,javascript,html,knockout.js,Javascript,Html,Knockout.js,我有一个带有onkeypress事件的html文本框来发送如下消息 <input type="text" data-bind="attr:{id: 'txtDim' + $data.userID, onkeypress: $root.sendMsg('#txtDim' + $data.userID, $data)}" /> 在我的情况下,我必须按两次回车键才能发送消息。 1:按键呼叫self.sendMsg 2:按键呼叫self.SendDIM 但我只需要按一次键就可以发送消息

我有一个带有onkeypress事件的html文本框来发送如下消息

<input type="text" data-bind="attr:{id: 'txtDim' +  $data.userID, onkeypress: $root.sendMsg('#txtDim' +  $data.userID, $data)}" />
在我的情况下,我必须按两次回车键才能发送消息。 1:按键呼叫self.sendMsg 2:按键呼叫self.SendDIM


但我只需要按一次键就可以发送消息。它只能在纯javascript中完成。但我需要viewmodel数据,所以应用于数据绑定。因此工作不正常。

您需要按两次enter键的原因是您的
sendMsg
方法仅将处理程序附加到
按键事件。然后在第二次按下按钮时调用该处理程序

更好的方法是编写一个自定义绑定处理程序,附加事件处理程序并通过以下方式传递视图模型:

ko.bindingHandlers.returnAction = {
  init: function(element, valueAccessor, allBindingsAccessor, viewModel) {

    var value = ko.utils.unwrapObservable(valueAccessor());

    $(element).keydown(function(e) {
      if (e.which === 13) {
        value(viewModel);
      }
    });
  }
};

您可以看到一个

我在文本框中添加了如下的按键事件

 <input type="text" data-bind="attr:{id: 'txtGoalsheetNote' +  $data.userID}, event:{keypress: $root.SendMsg}" />

那就是工作了。

谢谢。正是我想要的。我不得不按两次enter键,直到我注意到jsFidde中的valueUpdate:“afterkeyup”。这是一个比OP发布的答案更正确的解决方案,这对我很有效,而且似乎是一种“正确”的方式。非常好。我建议在字母表编写代码的最后一行使用“value(viewModel,e)”。这样消费函数就可以访问事件对象。不管怎样,谢谢你的代码,你帮我解决了一个问题。我想我更喜欢一点。它允许您在输入、选择、文本区域的祖先上设置enter键绑定。这样,您就不必在每个输入、选择、文本区域上重复绑定。另一方面,如果您想要细粒度的控件,这将起作用。但是,请注意,当按下ENTER键时具有焦点的元素可能不会更新VM,除非您首先将其模糊(),或者您必须在所有绑定的表单元素上使用类似于
valueUpdate:'afterkeyup'
的内容。这会直接将VM绑定到UI,通常被认为是一种反模式。
 <input type="text" data-bind="attr:{id: 'txtGoalsheetNote' +  $data.userID}, event:{keypress: $root.SendMsg}" />
 self.SendMsg= function (data, event) {
    try {
        if (event.which == 13) {
            //call method here
            return false;
        }
        return true;
    }
    catch (e)
{ }
}