使用knockout和javascript函数输入key enable
我有一个带有onkeypress事件的html文本框来发送如下消息使用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 但我只需要按一次键就可以发送消息
<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)
{ }
}