2013-03-08 12 views
151

mam formę takiego:Wyłącz przesłać przycisk, gdy forma nieważne z angularjs

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

Jak można zobaczyć, przycisk jest wyłączona, jeśli wejście jest pusty, ale to nie zmienia z powrotem włączona kiedy go zawiera tekst. Jak mogę to sprawić?

+0

http://www.angulartutorial.net/2016/04/disable-submit-button-until-all.html – Prashobh

Odpowiedz

306

Trzeba użyć nazwę swojej postaci, a także NG-inwalidów: Here's a demo on Plunker

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

Przepraszam, używam go teraz. Mimo to nadal jest wyłączony, nawet jeśli pole tekstowe zawiera tekst. – ali

+0

Tak, coś mi umknęło. Zaktualizowałem to. –

+0

Dzięki. To zrobiło – ali

30

dodać do tej odpowiedzi. Właśnie dowiedziałem się, że będzie to również przełamać jeśli użyć myślnika w nazwie postaci (kątowe 1.3):

więc będzie nie praca:

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

Tak, nazwa formularza powinna być w przypadku wielbłąda dla jakichkolwiek zatwierdzeń formularza AngularJS. – dubilla

+6

Jako zasada, wszystkie js jak wyrażenia rozpoznają obiekty w formie camelcase, podczas gdy myślnik jest dla html jak składnia – ecoologic

+0

Więc, co stanie się, jeśli formularz jest członkiem zestawu, i dlatego jest wymagane, aby mieć nazwę/a łącznik w nim (jak "my_formset_name-0")? – trubliphone

23

Wybrano odpowiedź jest poprawna, ale ktoś tak jak ja, mogą mieć problemy z sprawdzaniem asynchronizacji z wysyłaniem żądania do serwera - przycisk nie będzie wyłączony podczas danego przetwarzania żądania, więc przycisk będzie migał, co wygląda dość dziwnie dla użytkowników.

Aby to nieważne, po prostu trzeba obsłużyć $ oczekiwaniu stanu w postaci:

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

Bardzo dziękuję za rozwiązanie do sprawdzania asynchronizacji! –

1

Możemy stworzyć prosty dyrektywy i wyłączyć przycisk, aż wszystkie wymagane pola są 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'); 
    } 
    }); 
    } 
}; 
} 
); 

For More Info click here

+0

Twoja metoda rozwiązania działa dla mnie z niewielkim uszczypnięciem. Dziękuję – Tatipaka

+0

Dlaczego zrobiłbyś to, gdy istnieją rodzime dyrektywy 'ng-disabled' w kątowym 1.x i' [disabled] 'w kątowym 2 | 4.x, które są znacznie lepiej przetestowane niż to ?. Po drugie, dlaczego dyrektywa ma zasięg do formularza, aby wyłączyć zagnieżdżony przycisk, jest bardzo specyficzny. Źle przemyślane rozwiązanie IMO. –

+0

Powyżej jest przykładowa dyrektywa, oryginalna ma wiele scenariuszy, takich jak zagnieżdżone pole wyboru itp. I nie chcę niechlujstwa mojego kodu html dodając w każdym formularzu, zamiast tego ta dyrektywa zajmie się wszystkim. – Prashobh

0

<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ć nieco bardziej rygorystyczne

1

Jeśli używasz reaktywnych form można użyć to:

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