我正在编写一个简单的登录表单,使用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>
控制器:
var controller = function($scope) {
$scope.login = {
submit: function() {
Console.info($scope.login.username + ' ' + $scope.login.password);
}
}
};
问题是即使输入无效,也会调用login.submit
函数。是否可以防止这种行为?
作为旁注,我可以提一下,我也使用bootstrap和requirejs。
答案 0 :(得分:324)
你可以这样做:
<form name="loginform" novalidate ng-submit="loginform.$valid && login.submit()">
无需控制器检查。
答案 1 :(得分:67)
将提交按钮更改为:
<button type="submit" ng-disabled="loginform.$invalid">Login</button>
答案 2 :(得分:43)
所以TheHippo的建议答案对我不起作用,而是我最终将表单作为参数发送给函数,如下所示:
<form name="loginform" novalidate ng-submit="login.submit(loginForm)" class="css-form">
这使得表单在控制器方法中可用:
$scope.login = {
submit : function(form) {
if(form.$valid)....
}
答案 3 :(得分:13)
您的表单会自动作为对象放入$ scope。可以通过$scope[formName]
以下示例将与您的原始设置一起使用,而无需将表单本身作为ng-submit中的参数传递。
var controller = function($scope) {
$scope.login = {
submit: function() {
if($scope.loginform.$invalid) return false;
}
}
};
答案 4 :(得分:12)
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();
}
}
}
答案 5 :(得分:3)
虽然不是OP问题的直接解决方案,但如果您的表单在Origin
上下文中,但您希望Angular完全忽略它,则可以使用ngNonBindable
指令明确地执行此操作:< / p>
ng-app
答案 6 :(得分:2)
只是添加上面的答案,
我有2个常规按钮,如下所示。 (没有类型=&#34;提交&#34;任何地方)
<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>
无论我尝试了多少,在表单有效后按Enter键,&#34; Clear Form&#34;按钮被调用,清除整个表格。
作为解决方法,
我必须添加一个禁用和隐藏的虚拟提交按钮。 这个虚拟按钮必须位于所有其他按钮之上,如下所示。
<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>
好吧,我的意图是永远不要在Enter上提交,所以上面给出的hack工作正常。
答案 7 :(得分:1)
我知道这是一个老话题,但我想我也会做出贡献。我的解决方案类似于已标记为答案的帖子。一些内联JavaScript检查可以解决问题。
ng-click="form.$invalid ? alert('Please correct the form') : saveTask(task)"
答案 8 :(得分:0)
我知道已经很晚了并得到了回答,但我想分享我所做的那些整洁的东西。 我创建了一个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">