我有这样的表格:
<form name="myForm">
<input name="myText" type="text" ng-model="mytext" required />
<button disabled="{{ myForm.$invalid }}">Save</button>
</form>
如您所见,如果输入为空,则该按钮被禁用,但当它包含文本时它不会变回启用。我怎样才能让它工作?
我有这样的表格:
<form name="myForm">
<input name="myText" type="text" ng-model="mytext" required />
<button disabled="{{ myForm.$invalid }}">Save</button>
</form>
如您所见,如果输入为空,则该按钮被禁用,但当它包含文本时它不会变回启用。我怎样才能让它工作?
您需要使用表单的名称以及 ng-disabled:这是 Plunker 上的演示
<form name="myForm">
<input name="myText" type="text" ng-model="mytext" required />
<button ng-disabled="myForm.$invalid">Save</button>
</form>
添加到这个答案。我刚刚发现,如果您在表单名称中使用连字符(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>
选择的响应是正确的,但是像我这样的人可能会在向服务器端发送请求时遇到异步验证问题 - 在给定的请求处理期间按钮不会被禁用,因此按钮会闪烁,这对用户来说看起来很奇怪。
要取消这一点,您只需要处理表单的 $pending 状态:
<form name="myForm">
<input name="myText" type="text" ng-model="mytext" required />
<button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>
如果您使用的是反应式表单,则可以使用:
<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>
<form name="myForm">
<input name="myText" type="text" ng-model="mytext" required/>
<button ng-disabled="myForm.$pristine|| myForm.$invalid">Save</button>
</form>
如果你想更严格一点
我们可以创建一个简单的指令并禁用按钮,直到填写所有必填字段。
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');
}
});
}
};
}
);