Wyłącz przycisk Wyślij, gdy formularz jest nieprawidłowy za pomocą AngularJS

Mam taką formę:

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

Jak widać, przycisk jest wyłączony, jeśli wejście jest puste, ale nie zmienia się z powrotem na włączone, gdy zawiera tekst. Jak mogę to zrobić?

Author: Josh Crozier, 2013-03-08

6 answers

Musisz użyć nazwy formularza, a także ng-disabled: Oto demo na Plunker

<form name="myForm">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="myForm.$invalid">Save</button>
</form>
 318
Author: Ben Lesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-08 17:48:46

Aby dodać do tej odpowiedzi. Właśnie się dowiedziałem, że również się zepsuje, jeśli użyjesz myślnika w nazwie formularza (Angular 1.3):

Więc to nie zadziała:

<form name="my-form">
    <input name="myText" type="text" ng-model="mytext" required />
    <button ng-disabled="my-form.$invalid">Save</button>
</form>
 31
Author: wvdz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-28 21:38:44

Wybrana odpowiedź jest poprawna, ale ktoś taki jak ja może mieć problemy z walidacją asynchroniczną z wysłaniem żądania do serwera-przycisk nie będzie wyłączony podczas przetwarzania żądania, więc przycisk będzie migał, co wygląda dość dziwnie dla użytkowników.

Aby to unieważnić, wystarczy obsłużyć $oczekujący stan formularza:

<form name="myForm">
  <input name="myText" type="text" ng-model="mytext" required />
  <button ng-disabled="myForm.$invalid || myForm.$pending">Save</button>
</form>
 26
Author: Ivan Sokalskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-23 17:09:26

Jeśli używasz form reaktywnych, możesz użyć tego:

<button [disabled]="!contactForm.valid" type="submit" class="btn btn-lg btn primary" (click)="printSomething()">Submit</button>
 2
Author: Nelul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 12:31:16

Możemy utworzyć prostą dyrektywę i wyłączyć przycisk, dopóki wszystkie obowiązkowe pola nie zostaną wypełnione.

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

Aby uzyskać więcej informacji kliknij tutaj

 1
Author: Prashobh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-26 17:38:06

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

Jeśli chcesz być trochę bardziej rygorystyczny

 0
Author: Cengkuru Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-14 02:14:51