使用knockout和javascript函数输入键启用

ake*_*eth 10 html javascript knockout.js

我有一个带有onkeypress事件的html文本框,可以发送如下信息

<input type="text" data-bind="attr:{id: 'txtDim' +  $data.userID, onkeypress: $root.sendMsg('#txtDim' +  $data.userID, $data)}" />
Run Code Online (Sandbox Code Playgroud)

我已经编写了javascript函数来发送消息,同时按下面输入按钮:

self.sendMsg = function (id, data) {
    $(id).keydown(function (e) {
        if (e.which == 13) {
            //method called to send message
            //self.SendDIM(data);
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

在我的情况下,我必须按2次输入按钮发送消息.1:按键调用self.sendMsg 2:按键调用self.SendDIM

但我只需要在一个按键上发送消息.它只能在普通的javascript中完成.但我需要viewmodel数据,因此应用于data-bind.所以不能正常工作.

Ste*_*rex 17

您需要按两次输入的原因是您的sendMsg方法仅将keydown事件处理程序附加到事件.然后在第二个按钮上调用此处理程序.

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

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);
      }
    });
  }
};
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到一个运行的例子


ake*_*eth 6

我已经将下面的按键事件添加到文本框中

 <input type="text" data-bind="attr:{id: 'txtGoalsheetNote' +  $data.userID}, event:{keypress: $root.SendMsg}" />
Run Code Online (Sandbox Code Playgroud)

在javascript中,我通过将事件作为参数添加了以下方法

 self.SendMsg= function (data, event) {
    try {
        if (event.which == 13) {
            //call method here
            return false;
        }
        return true;
    }
    catch (e)
{ }
}
Run Code Online (Sandbox Code Playgroud)

然后它的工作.