当输入验证失败时,Angularjs会阻止表单提交

Run*_*lse 152 validation angularjs

我正在使用angularjs编写一个简单的登录表单,其中包含一些客户端输入验证,以检查用户名和密码是否为空且超过三个字符.请参阅以下代码:

<form name="loginform" novalidate ng-submit="login.submit()" class="css-form">
    <fieldset>

        <div class="control-group input-prepend">
            <span class="add-on"><i class="icon-user"></i></span>
            <input type="text" ng-model="login.username" name="username" required ng-minlength="3" placeholder="username" />
        </div>

        <div class="control-group input-prepend">
            <span class="add-on"><i class="icon-lock"></i></span>
            <input type="password" ng-model="login.password" name="password" required ng-minlength="3" placeholder="" />
        </div>

        <div class="control-group">
            <input class="btn" type="submit" value="Log in">
        </div>

    </fieldset>
</form>
Run Code Online (Sandbox Code Playgroud)

和控制器:

var controller = function($scope) {

    $scope.login = {
        submit: function() {

            Console.info($scope.login.username + ' ' + $scope.login.password);
        }
    }

};
Run Code Online (Sandbox Code Playgroud)

问题是login.submit即使输入无效,也会调用该函数.是否有可能阻止这种行为?

作为旁注,我可以提一下,我也使用bootstrap和requirejs.

cyb*_*bat 326

你可以做:

<form name="loginform" novalidate ng-submit="loginform.$valid && login.submit()">
Run Code Online (Sandbox Code Playgroud)

无需控制器检查.

  • 我不同意"不需要控制器检查".如果我们在提交函数中发生其他验证检查,该怎么办? (10认同)
  • 这应该是公认的答案.无需检查控制器中的任何内容 (8认同)
  • 在指令中执行附加验证.使用$ setValidity更新验证. (6认同)

Bij*_*jan 67

将提交按钮更改为:

<button type="submit" ng-disabled="loginform.$invalid">Login</button>
Run Code Online (Sandbox Code Playgroud)

  • 如果在输入字段具有焦点时按Enter键,您仍然可以提交表单! (24认同)
  • 这应该是真正接受的答案. (3认同)
  • @Red:见上面的评论. (2认同)

Run*_*lse 43

所以TheHippo的建议答案对我不起作用,而是我最终将表单作为参数发送给函数,如下所示:

<form name="loginform" novalidate ng-submit="login.submit(loginForm)" class="css-form">
Run Code Online (Sandbox Code Playgroud)

这使得表单在控制器方法中可用:

$scope.login = {
    submit : function(form) {
        if(form.$valid)....
    }
Run Code Online (Sandbox Code Playgroud)


dav*_*dem 13

您的表单将自动作为对象放入$ scope.它可以通过访问$scope[formName]

下面的示例将与您的原始设置一起使用,而无需将表单本身作为ng-submit中的参数传递.

var controller = function($scope) {

    $scope.login = {
        submit: function() {
            if($scope.loginform.$invalid) return false;

        }
    }

};
Run Code Online (Sandbox Code Playgroud)

工作示例:http://plnkr.co/edit/BEWnrP?p = preview

  • 如果使用"As Controller"表示法而不是$ scope,您将如何访问表单? (4认同)

The*_*ppo 12

HTML:

<div class="control-group">
    <input class="btn" type="submit" value="Log in" ng-click="login.onSubmit($event)">
</div>
Run Code Online (Sandbox Code Playgroud)

在你的控制器中:

$scope.login = {
    onSubmit: function(event) {
        if (dataIsntValid) {
            displayErrors();
            event.preventDefault();
        }
        else {
            submitData();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果按Enter键提交表单,则无效. (3认同)