Вимкнути кнопку надсилання, коли форма недійсна за допомогою 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

Щоб додати до цієї відповіді. Щойно я з’ясував, що він також зламається, якщо ви будете використовувати дефіс у назві форми (кутовий 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-синтаксису
ecoologic

Отже, що відбувається, якщо форма є членом набору форматів, і тому потрібно мати ім'я w / дефіс (наприклад, "my_formset_name-0")?
trubliphone

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

Якщо ви використовуєте Реактивні форми, ви можете скористатися цим:

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

2
Хоча це дійсна порада для "Angular", ця відповідь є недійсною для "AngularJS". А саме, (click)і [disabled]не є дійсним AngularJS коду, так само як і хімічно активними форм частина каркаса AngularJS. "AngularJS - назва для Angular сьогодні та завтра. AngularJS - це назва для всіх версій 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-код, додаючи в будь-яку форму, натомість ця директива піклується про всі речі.
Прашобх

1

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

Якщо ти хочеш бути трохи суворішим

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.