AngularJS ile form geçersiz olduğunda gönderme düğmesini devre dışı bırak


174

Ben böyle bir form var:

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

Gördüğünüz gibi, giriş boşsa düğme devre dışı bırakılır, ancak metin içerdiğinde tekrar etkinleştirilmez. Nasıl çalıştırabilirim?


Yanıtlar:


339

Formunuzun adını kullanmanız ve ng devre dışı bırakmanız gerekir : İşte Plunker hakkında bir demo

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

Üzgünüm, şimdi kullanıyorum. Yine de, metin kutusu metin içerdiğinde bile devre dışı bırakıldı
ali

1
+1 Tesadüfen, sadece bu harika yazınızı okuyordum: benlesh.com/2012/11/angular-js-form-validation.html
Ben

bir formum yoksa ne olur? Bunu div öğesinde de yapabilir miyim?
VsMaX

1
Bir div etiketine ng-formu ekleyebilirsiniz, teknik olarak @MichaelCwienczek: <div ng-form="myForm"> ... stuff here .. </div>. Girişlerden bir değer gönderiyorsanız, düğmeye bastığınızda , bir kullanıcının [ENTER] tuşuna basmasına ve formu göndermesine izin vermesinden başka bir neden yoksa, bir etiket kullanmanızı şiddetle tavsiye ederim <form/>. Ancak erişilebilirlik kaygıları gibi şeyler nedeniyle muhtemelen daha iyi uygulama oluşturur.
Ben Lesh

2
@BenLesh, gönder düğmesi formumun içinde değilse ve form geçersizse yine de devre dışı bırakmam gerekir.
Yeşil Büyücü

33

Bu cevaba eklemek için. Ben sadece form adınızda (Açısal 1.3) bir tire kullanırsanız da yıkılacağını öğrendim:

Bu nedenle değil çalışır:

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

3
Evet, herhangi bir AngularJS form doğrulaması için form adı deve durumunda olmalıdır.
dubilla

7
genel bir kural olarak, ifadeler gibi tüm j'ler deve şeklindeki nesneleri tanıyacak, çizgi html benzeri sözdizimi içindir
ecoologic 15:03

Öyleyse, form bir form kümesinin üyesiyse ve bu nedenle içinde tire işareti olan bir ad ("my_formset_name-0" gibi) olması gerekiyorsa ne olur?
trubliphone

2
Yukarıdaki örnekte, myForm.$invalidhala çalışması gerektiğine inanıyorum , bu yüzden sizin durumunuzda, my_formset_name0.$invalidçalışması gerektiğini düşünüyorum .
wvdz

29

Seçilen yanıt doğrudur, ancak benim gibi biri, sunucu tarafına istek gönderme ile zaman uyumsuz doğrulama ile ilgili sorunlar yaşayabilir - verilen istek işleme sırasında düğme devre dışı bırakılmaz, bu nedenle düğme yanıp söner, bu da kullanıcılar için oldukça garip görünür.

Bunu geçersiz kılmak için formun $ bekleyen durumunu ele almanız yeterlidir:

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

Zaman uyumsuz doğrulama çözümü için çok teşekkür ederim!
Martin Brandl

!myForm.$validBekleyen sorunları da zaman uyumsuz olarak kullanmalısınız . itnext.io/valid-and-invalid-in-angular-forms-61cfa3f2a0cd
SavageCore

6

Reaktif Formlar kullanıyorsanız bunu kullanabilirsiniz:

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

2
Bu "Açısal" için geçerli bir tavsiye olsa da, bu yanıt "Açısal JS" için geçersizdir. Yani, (click)ve [disabled]geçerli angularjs kod değildir, ne Reaktif Formlar angularjs çerçevesinin bir parçasıdır. "Eğik bugünün ve yarının açısal adıdır angularjs Açısal tüm v1.x sürümleri için adıdır." Angular.io/guide/ajs-quick-reference
dapperdan1985

1

Basit bir yönerge oluşturabilir ve tüm zorunlu alanlar dolana kadar düğmeyi devre dışı bırakabiliriz.

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

Daha Fazla Bilgi İçin Tıklayınız


Çözüm yönteminiz benim için küçük bir değişiklikle işe yarıyor. Teşekkür ederim
Tatipaka

Bunu ng-disabledaçısal 1.x ve [disabled]açısal 2 | 4.x'te bundan daha iyi test edilen yerel yönergeler olduğunda neden yapasınız ki? İkincisi, neden iç içe yerleştirilmiş bir düğmeyi devre dışı bırakmak için bir forma dahil edilen bir yönerge var, bu çok özel. Kötü düşünülmüş bir çözüm IMO.
David Barker

Yukarıda örnek bir direktif, orijinal iç içe onay kutusu vb gibi birçok senaryo var ve ben her formda ekleyerek html kodumu dağınık istemiyorum, bunun yerine bu direktif her şeyi halleder.
Prashobh

1

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

Biraz daha katı olmak istiyorsan

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.