jquery-ui – knockoutjs提交绑定没有正确处理输入密钥

前端之家收集整理的这篇文章主要介绍了jquery-ui – knockoutjs提交绑定没有正确处理输入密钥前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个 jquery ui对话框,在表单上有一个knockoutjs提交绑定.可以通过按取消按钮,按对话框标题栏上的关闭按钮,按下转义或按保存按钮来关闭对话框.我的意图是取消,转义和标题关闭事件应该在不应用任何操作的情况下关闭对话框,而按Enter或单击“保存”应该执行对话框操作.除了输入键之外,一切都按预期工作,这会导致取消事件,而不是在提交事件中.

我创建了一个jsfiddle来说明这一点,并在下面包含代码以供参考.

我为冗长的代码道歉…

基因

  1. <!-- ko with: dialog -->
  2. <div id="taskdlg" class="resizeableDialog"
  3. data-bind="dialog: {autoOpen: false,title: 'Edit task',height: 200,width: 500,modal: true,close: updateCloseState},openWhen: open">
  4. <form data-bind="submit: update">
  5. <table>
  6. <tr>
  7. <td style="width: 100px;"><label for="tasktitle">Title</label></td>
  8. <td width="*">
  9. <input id="tasktitle" type="text" placeholder="Task name" data-bind="value: titletext,valueUpdate: 'afterkeydown'" />
  10. </td>
  11. </tr>
  12. <tr>
  13. <td><button style="float: left;" data-bind="click: cancel">Cancel</button></td>
  14. <td><button style="float: right;" type="submit">Save</button></td>
  15. </tr>
  16. </table>
  17. </form>
  18. </div>
  19. <!-- /ko -->
  20.  
  21. <button data-bind="click: editTask">Edit</button>
  22. <span data-bind="text: task"></span>

javascript如下:

  1. ko.bindingHandlers.dialog = {
  2. init: function(element,valueAccessor,allBindingsAccessor) {
  3. var options = ko.utils.unwrapObservable(valueAccessor());
  4. setTimeout(function() { $(element).dialog(options || {}); },0);
  5.  
  6. //handle disposal (not strictly necessary in this scenario)
  7. ko.utils.domNodeDisposal.addDisposeCallback(element,function() {
  8. $(element).dialog("destroy");
  9. });
  10. },update: function(element,allBindingsAccessor) {
  11. var shouldBeOpen = ko.utils.unwrapObservable(allBindingsAccessor().openWhen);
  12. $(element)
  13. .dialog(shouldBeOpen ? "open" : "close");
  14. }
  15. };
  16.  
  17. function Task(name) {
  18. var self = this;
  19. this.title = ko.observable(name);
  20.  
  21. this.toString = function() { return "Task: " + self.title(); };
  22. }
  23.  
  24. function TaskDialog(viewmodel) {
  25. var self = this;
  26.  
  27. this.viewmodel = viewmodel;
  28. this.task = ko.observable();
  29. this.open = ko.observable(false);
  30. this.titletext = ko.observable();
  31.  
  32. this.editTask = function(task) {
  33. self.task(task);
  34. self.titletext(task.title());
  35. self.open(true);
  36. }
  37.  
  38. this.update = function() {
  39. var task = self.task();
  40. task.title(self.titletext());
  41. self.open(false);
  42. }
  43.  
  44. this.updateCloseState = function() {
  45. if (self.open())
  46. self.open(false);
  47. }
  48.  
  49. this.cancel = function() {
  50. self.open(false);
  51. }
  52. }
  53.  
  54.  
  55. function viewmodel() {
  56. var self = this;
  57. this.dialog = ko.observable(new TaskDialog(self));
  58. this.task = ko.observable(new Task('sample task'));
  59.  
  60. this.editTask = function() {
  61. self.dialog().editTask(self.task());
  62. }
  63. };
  64.  
  65. ko.applyBindings(new viewmodel());

解决方法

如果按钮没有类型,则浏览器会假设它可以被视为提交按钮.因此,当您按Enter键时,正在执行取消按钮的方法,并阻止默认提交实际发生.因此,如果您要在“取消”按钮之前移动“保存”按钮,它将正常工作.

但是,修复它的真正方法是在你的取消中添加type =“button”:

  1. <button type="button" style="float: left;" data-bind="click: cancel">Cancel</button>

http://jsfiddle.net/rniemeyer/HwbD2/11/

猜你在找的jQuery相关文章