Отключить кнопку "Отправить", когда форма недействительна с AngularJS


У меня есть такой:

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

Как вы можете видеть, кнопка отключена, если вход пуст, но он не возвращается к включенному, когда он содержит текст. Как я могу заставить его работать?

6 165

6 ответов:

вам нужно использовать имя вашей формы, а также ng-disabled:вот демо на Plunker

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

добавить к этому ответу. Я только что узнал, что он также сломается, если вы используете дефис в имени формы (угловой 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>

мы можем создать простую директиву и отключить кнопку, пока не будут заполнены все обязательные поля.

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');
    }
   });
  }
 };
}
);

для получения дополнительной информации нажмите здесь

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

Если вы хотите быть немного более строгим