当inputvalidation失败时,Angularjs阻止表单提交
我正在写一个简单的login表单使用angularjs与一些客户端inputvalidation,以检查用户名和密码是不是空的和长于三个字符。 看下面的代码:
<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>
和控制器:
var controller = function($scope) { $scope.login = { submit: function() { Console.info($scope.login.username + ' ' + $scope.login.password); } } };
问题是,即使input无效, login.submit
函数也会被调用。 有没有可能防止这种行为?
作为一个方面的说明,我可以提到,我也使用bootstrap和requirejs。
将提交button更改为:
<button type="submit" ng-disabled="loginform.$invalid">Login</button>
你可以做:
<form name="loginform" novalidate ng-submit="loginform.$valid && login.submit()">
不需要控制器检查。
所以从TheHippo的build议答案不适合我,而是我最终发送表单作为参数的函数如下所示:
<form name="loginform" novalidate ng-submit="login.submit(loginForm)" class="css-form">
这使得控制器方法中的表单可用:
$scope.login = { submit : function(form) { if(form.$valid).... }
您的表单将作为对象自动放入$ scope。 它可以通过$scope[formName]
下面是一个可以使用原始设置的例子,而不必在ng-submit中将表单本身作为parameter passing。
var controller = function($scope) { $scope.login = { submit: function() { if($scope.loginform.$invalid) return false; } } };
工作示例: http : //plnkr.co/edit/BEWnrP?p=preview
HTML:
<div class="control-group"> <input class="btn" type="submit" value="Log in" ng-click="login.onSubmit($event)"> </div>
在你的控制器中:
$scope.login = { onSubmit: function(event) { if (dataIsntValid) { displayErrors(); event.preventDefault(); } else { submitData(); } } }
只是为了增加上面的答案,
我有一个2个常规button,如下所示。 (没有types=“提交”任何地方)
<button ng-click="clearAll();" class="btn btn-default">Clear Form</button> <button ng-disabled="form.$invalid" ng-click="submit();"class="btn btn-primary pull-right">Submit</button>
无论我尝试了多less次, 一旦表格有效 , 按回车 ,“清除表格”button被调用,清除整个表格。
作为一种解决方法,
我不得不添加一个被禁用和隐藏的虚拟提交button。 而这个虚拟button必须在所有其他button之上,如下所示 。
<button type="submit" ng-hide="true" ng-disabled="true">Dummy</button> <button ng-click="clearAll();" class="btn btn-default">Clear Form</button> <button ng-disabled="form.$invalid" ng-click="submit();"class="btn btn-primary pull-right">Submit</button>
那么,我的意图是从来没有提交回车,所以上面给的破解工作正常。
虽然不是OPs问题的直接解决scheme,但如果您的表单处于ng-app
上下文中,但您希望Angular完全忽略它,则可以使用ngNonBindable
指令明确地执行此操作:
<form ng-non-bindable> ... </form>
我知道这是一个古老的线索,但我想我也会做出贡献。 我的解决scheme与已经标记为答案的post类似。 一些内嵌的JavaScript检查可以做到这一点。
ng-click="form.$invalid ? alert('Please correct the form') : saveTask(task)"
我知道已经很晚了,已经回答了,但我想分享一下我制作的整齐的东西。 我创build了一个ng-validate指令来挂钩表单的onsubmit,然后如果$ eval为false,它会发出prevent-default:
app.directive('ngValidate', function() { return function(scope, element, attrs) { if (!element.is('form')) throw new Error("ng-validate must be set on a form elment!"); element.bind("submit", function(event) { if (!scope.$eval(attrs.ngValidate, {'$event': event})) event.preventDefault(); if (!scope.$$phase) scope.$digest(); }); }; });
在你的html:
<form name="offering" method="post" action="offer" ng-validate="<boolean expression">
- 如何快速validation电子邮件地址?
- 使用正则expression式来validation电子邮件地址
- “validation”和“validation”之间有什么区别?
- 从Controller手动设置ModelState.isValid
- 正则expression式的字母数字,至less有1个数字和1个字符
- 没有包含<form>的AngularJS <input>validation
- 使用WPF和entity framework的DataAnnotationsvalidation数据?
- ASP.NET MVC 5 Web.config:“FormsAuthenticationModule”或“FormsAuthentication”
- 基于外部因素validation对象(即数据存储唯一性)