当表单对AngularJS无效时,禁用提交按钮


174

我有这样的表格:

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button disabled="{{ myForm.$invalid }}">Save</button>
</form>

如您所见,如果输入为空,则该按钮将被禁用,但是当包含文本时,该按钮不会变回启用状态。我该如何运作?


Answers:


339

您需要使用表单名称以及ng-disabled:这是Plunker上的演示

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="myForm.$invalid">Save</button>
</form>

抱歉,我现在使用它。但是,即使文本框包含文本,它仍然被禁用
2013年

1
+1巧合的是,我只是读你这个伟大的职位:benlesh.com/2012/11/angular-js-form-validation.html

如果我没有表格怎么办?我也可以在div元素上这样做吗?
VsMaX 2014年

1
@MichaelCwienczek从技术上讲,您可以将ng-form添加到div标签:<div ng-form="myForm"> ... stuff here .. </div>。虽然,如果您要从输入中提交值,则在按钮按下时,我强烈建议您使用<form/>标签,如果没有其他原因,它允许用户点击[ENTER]并提交表单。但是由于诸如可访问性之类的问题,它也可能构成更好的实践。
Ben Lesh 2014年

2
@BenLesh,如果“提交”按钮不在表单中怎么办,并且如果表单无效,我仍然必须禁用它。
绿色巫师

33

要添加到此答案。我刚刚发现,如果您在表单名称中使用连字符(Angular 1.3),它也会崩溃:

因此,这将工作:

<form name="my-form">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="my-form.$invalid">Save</button>
</form>

3
是的,对于任何AngularJS表单验证,表单名称均应采用驼峰形式。
dubilla

7
根据经验,所有类似js的表达式都可以识别驼峰形式的对象,而破折号代表类似html的html
ecoologic 2014年

因此,如果表单是表单集的成员,因此要求在表单中带有连字符(例如“ my_formset_name-0”),该怎么办?
trubliphone 2015年

2
在上面的示例中,我认为myForm.$invalid应该仍然可以使用,因此对于您的情况,我认为my_formset_name0.$invalid应该可以使用。
wvdz 2015年

29

选定的响应是正确的,但是像我这样的人可能会对向服务器端发送请求的异步验证存在问题-在给定的请求处理期间不会禁用按钮,因此按钮会闪烁,这对用户来说很奇怪。

要使此无效,您只需要处理表单的$ pending状态:

<form name="myForm">
  <input name="myText" type="text" ng-model="mytext" required />
  <button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>

非常感谢您提供异步验证解决方案!
Martin Brandl

您应该只使用!myForm.$valid它来处理异步待处理问题。itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore '19

6

如果您使用的是反应式表格,则可以使用以下方法:

<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>

2
尽管这对于“ Angular”是有效的建议,但此答案对于“ AngularJS”无效。即,(click)并且[disabled]不是有效的AngularJS代码,也不是Reactive Forms属于AngularJS框架的一部分。 “ Angular是今天和明天的Angular的名称 。AngularJS
dapperdan1985 '18

1

我们可以创建一个简单的指令并禁用按钮,直到所有必填字段均已填写。

angular.module('sampleapp').directive('disableBtn',
function() {
 return {
  restrict : 'A',
  link : function(scope, element, attrs) {
   var $el = $(element);
   var submitBtn = $el.find('button[type="submit"]');
   var _name = attrs.name;
   scope.$watch(_name + '.$valid', function(val) {
    if (val) {
     submitBtn.removeAttr('disabled');
    } else {
     submitBtn.attr('disabled', 'disabled');
    }
   });
  }
 };
}
);

欲了解更多信息请点击这里


您的解决方案对我几乎没有任何调整。谢谢
Tatipaka 2016年

ng-disabled在angular 1.x和[disabled]angular 2 | 4.x中有本机指令比这要好得多的测试时,为什么还要这样做呢?其次,为什么要有一个范围限定为禁用嵌套按钮的表单的指令,它是超级特定的。一个糟糕的思想解决方案IMO。
大卫·巴克

上面是一个示例指令,原始指令有很多情况,例如嵌套复选框等,我不想通过添加每种形式来弄乱我的html代码,相反,该指令会注意所有事情。
Prashobh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.