AngularJS绑定到输入的回车键,如果输入是按钮,则提交

angularJS bind to input's enter key and submit if input is button

本文关键字:输入 如果 按钮 提交 绑定 回车 AngularJS      更新时间:2023-09-26

>我有这样的指令,转到模态窗口中的下一个输入(或按钮):

.directive('autoVrm', function () {
    return function (scope, element, attrs) {
                var counter = 0;
            element.bind("keydown keypress", function (event) {
                console.log(element);           
                if(event.which === 13) {
                        counter++;
                    event.preventDefault();
                    var elementToFocus = element.find('input')[counter] || element.find('button')[1];
                    console.log(elementToFocus.type);
                    if(angular.isDefined(elementToFocus))
                        elementToFocus.focus();
                    if (elementToFocus.type === 'button'){
                        counter = -1;
                        elementToFocus.bind("keydown keypress", function (eventSubmit) {
                            if(eventSubmit.which === 13) {
                                console.log('submit');
                            }
                        });
                    }
                }
            });
        };

但是我有一个麻烦,如果我在按钮上,然后单击输入,我得到:

Uncaught TypeError: undefined is not a function

但是为什么呢? 如何使输入点击提交表单? 不依赖控制器?

尝试 angular.element(elementToFocus).bind for the Uncatch TypeError。

关于您的新评论:

如果这是在控制器中定义的

$scope.registerUser = function() {
    ...
}

然后在指令中简单地调用它

elementToFocus.bind("keydown keypress", function (eventSubmit) {
    if(eventSubmit.which === 13) {
        scope.registerUser();
    }
});

作为猜测,您可以执行诸如检查attrs参数以获取"data-ng-click"的值并调用相应的函数之类的操作:

elementToFocus.bind("keydown keypress", function (eventSubmit) {
    if(eventSubmit.which === 13) {
        if (attrs.dataNgClick == "registerUser()" {
            scope.registerUser();
        }
        else if (attrs.dataNgClick == "sign()" {
            scope.sign();
        }
        else if (attrs.dataNgClick == "frgtPassword()" {
            scope.frgtPassword();
        }
    }
});

这种行为已经在 Web 技术中定义过。当您在表单内按 Enter 时,表单将提交。为此,您需要处理正确的事件(ng-submit)。您可以使用更少的代码实现所需的效果。

angular.module('app', [])
.controller('MyCtrl', function () {
  var self = this;
  self.message = "press ENTER to submit"; 
  self.count = 0; 
  this.onSubmit = function () {
    self.count++;
    self.message = "form submitted " + self.count + " times";
  };
});
<!DOCTYPE html>
<html ng-app="app">
  <head>
    <script data-require="angular.js@*" data-semver="1.4.0-beta.1" src="https://code.angularjs.org/1.4.0-beta.1/angular.js"></script>
    <link rel="stylesheet" href="style.css" />
    <script src="script.js"></script>
  </head>
  <body ng-controller="MyCtrl as ctrl">
    <h1>Hello Stack Overflow!</h1>
    <form ng-submit="ctrl.onSubmit()">
      <input type="text" placeholder="press ENTER"/>
      <input type="text" placeholder="press ENTER"/>
      <input type="submit" value="Send" />
    </form>
    <div>{{ctrl.message}}</div>
  </body>
</html>

相关文章: