10

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

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

我已经编写了 javascript 函数来发送消息,同时按下回车按钮,如下所示:

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

就我而言,我必须按两次 Enter 按钮才能发送消息。1:按键调用self.sendMsg 2:按键调用self.SendDIM

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

4

2 回答 2

17

您需要按两次 enter 的原因是您的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);
      }
    });
  }
};

您可以在此处查看运行示例

于 2013-01-12T11:57:24.977 回答
6

我已将如下所示的按键事件添加到文本框

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

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

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

然后它的工作。

于 2013-01-14T12:41:31.047 回答