调用function,进入按键
当input键被按下时,如何使用knockout.js调用一个函数..下面是我的代码。
ko.bindingHandlers.enterkey = { init: function (element, valueAccessor, allBindingsAccessor, viewModel) { var inputSelector = 'input,textarea,select'; $(document).on('keypress', inputSelector, function (e) { var allBindings = allBindingsAccessor(); $(element).on('keypress', 'input, textarea, select', function (e) { var keyCode = e.which || e.keyCode; if (keyCode !== 13) { alert('a'); return true; } var target = e.target; target.blur(); allBindings.enterkey.call(viewModel, viewModel, target, element); alert('b'); return false; }); }); } }; ko.applyBindings(viewModel);
HTML
<input type="text" data-bind="value:sendMessageText, enterkey: sendMessage" />
视图模型
function contactsModel(){ var self = this; self.jid=ko.observable(); self.userName=ko.observable(); self.sendMsgText=ko.observable(); self.sendMessage = function(){ if(self.sendMessageText() == '' ) alert("Enter something in input field"); else{ var message = { to : self.userName(), message : self.sendMsgText() } self.sentMessages.push(message); sendMessage(message); } } }
任何想法是关于什么是错误的或更好的方法的build议。
当你创build自己的knockout bindingHandler时,它和其他bindingHanlders的用法相同,例如: data-bind="text: myvalue"
所以你的HTML需要看起来像这样
<input type="text" data-bind="value:sendMessageText, valueUpdate: 'afterkeydown', enterkey: sendMessage" />
要添加的重要绑定是valueUpdate: 'afterkeydown'
绑定。 如果在用户在input中input文本并点击时没有此绑定inputonblur事件不会在enterkey
绑定之前enterkey
。 如果在由enterKey
调用的操作中访问input的值,这将导致observable返回一个意外的值,而不是当前的文本。
另一个看KnockoutJS的自定义绑定
编辑
这是我以前在其他项目上使用过的。 JsFiddle演示
ko.bindingHandlers.enterkey = { init: function (element, valueAccessor, allBindings, viewModel) { var callback = valueAccessor(); $(element).keypress(function (event) { var keyCode = (event.which ? event.which : event.keyCode); if (keyCode === 13) { callback.call(viewModel); return false; } return true; }); } };
不需要自定义绑定,只需使用knockout的按键事件( Knockout文档 ):
<input type="text" data-bind="textInput : keyword, event: {keypress: onEnter}" > </input>
而你的function:
that.onEnter = function(d,e){ e.keyCode === 13 && that.search(); return true; };
JSFiddle示例
编辑:从淘汰赛(3.2.0)的新绑定:textInput – 避免需要有一个valueUpdate绑定。
这工作对我来说,感谢@DaafVader的大部分。
在视图中
<input data-bind="value: searchText, valueUpdate: 'input', event: { keyup: searchKeyUp }" />
在viewmodel中
var searchKeyUp = function (d, e) { if (e.keyCode == 13) { search(); } }
这对我来说很有用,感谢@DaafVader。
鉴于:
<input id="myInput" type="text" data-bind="value : keyword, valueUpdate: 'afterkeydown'"> </input>
在javascript中:
$("#myInput").keyup(function (event) { if (event.keyCode == 13) { search(); } });
把关键事件放到你的jquery事件中而不是敲除事件中,可以减lessknockout viewmodel的复杂性。
在input的表单上使用提交绑定( http://knockoutjs.com/documentation/submit-binding.html ),这就是它的目的。
Knockout文档示例:
<form data-bind="submit: doSomething"> ... form contents like inputs go here ... <button type="submit">Submit</button> </form> <script type="text/javascript"> var viewModel = { doSomething : function(formElement) { // ... now do something } }; </script>
如果有的话,它也会自动处理你的button。