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


174

У меня есть моя форма, как это:

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

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


Ответы:


339

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

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

Извините, сейчас пользуюсь. Тем не менее, он по-прежнему отключен, даже если текстовое поле содержит текст
али

1
+1 По совпадению, я только что прочитал ваш великий пост: benlesh.com/2012/11/angular-js-form-validation.html
Бен

что если у меня нет формы? Могу ли я сделать это также на элементе div?
VsMaX

1
@MichaelCwienczek технически, вы можете добавить нг-форму в сНу тег: <div ng-form="myForm"> ... stuff here .. </div>. Хотя, если вы отправляете значение из входных данных, при нажатии кнопки я настоятельно рекомендую использовать <form/>тег, если только по какой-либо другой причине он позволяет пользователю нажать [ENTER] и отправить форму. Но это также, вероятно, представляет собой лучшую практику из-за таких вещей, как проблемы доступности.
Бен Леш

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.
Дубилла

7
как правило, все js-подобные выражения будут распознавать объекты в форме верблюда, а dash - для html-подобного синтаксиса
ecoologic

Итак, что произойдет, если форма является членом набора форм и, следовательно, должна содержать имя с дефисом (например, «my_formset_name-0»)?
Трублифон

2
В приведенном выше примере, я считаю, myForm.$invalidвсе еще должно работать, поэтому в вашем случае, я думаю, my_formset_name0.$invalidдолжно работать.
wvdz

29

Выбранный ответ правильный, но у кого-то, как я, могут возникнуть проблемы с асинхронной проверкой при отправке запроса на серверную сторону - кнопка не будет отключена во время обработки данного запроса, поэтому кнопка будет мигать, что выглядит довольно странно для пользователей.

Чтобы аннулировать это, вам просто нужно обработать состояние ожидания $ формы:

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

Большое спасибо за решение асинхронной проверки!
Мартин Брандл,

Вы должны просто использовать !myForm.$validэто обрабатывает асинхронные вопросы, ожидающие решения, а также. itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore

6

Если вы используете Reactive Forms, вы можете использовать это:

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

2
Хотя это верный совет для «Angular», этот ответ недействителен для «AngularJS». А именно, (click)и [disabled]не являются действительным AngularJS кода, равно как и химически активными форм часть каркаса AngularJS. «Angular - это имя для Angular сегодня и завтра. AngularJS - это название для всех версий Angular v1.x
dapperdan1985

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

Для дополнительной информации щелкните здесь


Ваш метод решения работает для меня с небольшой настройкой. Спасибо
Татипака

Зачем вам это делать, если есть нативные директивы ng-disabledв угловых 1.x и [disabled]угловых 2 | 4.x, которые гораздо лучше проверены, чем эта? Во-вторых, зачем иметь директиву, ограниченную формой для отключения вложенной кнопки, это супер специфично. Плохо продуманное решение ИМО.
Дэвид Баркер

Выше приведен пример директивы, оригинал имеет много сценариев, таких как вложенные флажки и т. Д., И я не хочу путать мой HTML-код, добавляя в каждую форму, вместо этого эта директива позаботится обо всем.
Prashobh

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.