我有一个带有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);
}
});
};
在我的情况下,我必须按2次输入按钮发送消息。 1:按键调用self.sendMsg 2:按键调用self.SendDIM
但我只需要在一个按键上发送消息。它只能在普通的javascript中完成。但我需要viewmodel数据,因此应用于data-bind。所以不能正常工作。
答案 0 :(得分: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);
}
});
}
};
您可以看到running example here
答案 1 :(得分:5)
我已将如下所示的按键事件添加到文本框
<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)
{ }
}
然后它的工作。