AngularJS: gönderme ve sunucu yanıtı arasındaki tüm form denetimlerini devre dışı bırakma


122

Kullanıcının "Kaydet" veya "Gönder" düğmesini tıkladığı bir süre boyunca form kontrollerini devre dışı bırakmak (veya en azından bunları kullanıcı etkileşimi için kullanılamaz hale getirmek) istersem en iyi (ve doğru) yaklaşımın ne olduğu konusunda ikilem yaşıyorum ve kablo üzerinden seyahat eden veriler. JQuery'yi (kötü olan !!!) kullanmak ve tüm öğeleri dizi olarak sorgulamak (sınıfa veya özellik işaretleyicisine göre) Şimdiye kadar sahip olduğum fikirler:

  • cm-form-control2 bildirime abone olacak tüm öğeleri özel yönergeyle işaretleyin: "veri gönderildi" ve "veri işlendi". Daha sonra, ikinci bildirimi göndermek veya bir sözü çözmek için özel kod sorumludur.
  • promiseTrackerBunu (ne yazık ki!) Gibi son derece aptal kodlar üretmek için kullanın ng-show="loadingTracker.active()". Açıkçası tüm öğelerde yok ng-disabledve kullanıcının ng-hide/show"dans eden" düğmelerden kaçınmasını istemiyorum .
  • Bir mermi ısır ve yine de JQuery kullan

Daha iyi bir fikri olan var mı? Şimdiden teşekkürler!

GÜNCELLENDİ: Alan kümesi fikri İŞE ÇALIŞIYOR. İşte hala aynı şeyi yapmak isteyenler için basit bir keman. Http://jsfiddle.net/YoMan78/pnQFQ/13/

HTML:

<div ng-app="myApp">
    <ng-form ng-controller="myCtrl">
        Saving: {{isSaving}}
        <fieldset ng-disabled="isSaving">
            <input type="text" ng-model="btnVal"/>
            <input type="button" ng-model="btnVal" value="{{btnVal}}"/>
            <button ng-click="save()">Save Me Maybe</button>
        </fieldset>
    </ng-form>
</div>

ve JS:

var angModule = angular.module("myApp", []);

angModule.controller("myCtrl", function ($scope, $filter, $window, $timeout) {
    $scope.isSaving = undefined;
    $scope.btnVal = 'Yes';
    $scope.save = function()
    {
        $scope.isSaving = true;
        $timeout( function()
             {
                 $scope.isSaving = false;
                 alert( 'done');
             }, 10000);
    };
});

Verileri formdan göndermek için hangi hizmeti kullanıyorsunuz? $ http veya $ resource?
François Romain

Olağanüstü bir şeyle uğraşmak zorunda olmadığım için aslında $ http.
YoMan78

Devre dışı bırakılan alan kümeleri IE'de çalışmaz, yani bir çözüm değildir. Bir Bootstrap modeli kullanıyorum ve arka planı statik olarak ayarlıyorum.
im1dermike

Not yazma anda bu bir hata varfieldset bir FlexBox kap olarak kullanılamaz
George Mauer

Yanıtlar:


283

Tüm alanlarınızı alan kümesine sarın ve ngDisabled yönergesini şu şekilde kullanın :

<fieldset ng-disabled="isSaving"> ... inputs ...</fieldset>

Alan kümesi içindeki tüm girişleri otomatik olarak devre dışı bırakacaktır.

Sonra kumandaya yerleştirilmiştir $scope.isSavingiçin truehttp önce çağrı ve falsesonrasında.


<button> ile bile gerçekten iyi çalışıyor gibi görünüyor! Çok teşekkürler Sasha.
YoMan78

9
Ama ne yazık ki bir fieldset devre dışı nitelik IE veya Safari desteklenmez iyi ipucu, var w3schools.com/tags/att_fieldset_disabled.asp
kiwiaddo

5
@kiwiaddo Testlerimde IE9 + 'da iyi çalışıyor. Bu arada w3schools.com en iyi referans web sitesi değil. Bu sayfayı kontrol etseniz iyi olur developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset
Alexander Puchkov

3
Giriş türü düğmesi, metin ve dosya IE11'de devre dışı bırakılmamış :-(, ayrıca düğme gri renkte ancak açısal ng-tıklama işleyicisi hala etkin.
Sebastian

3
@ im1dermike you right, gerçekten IE'de çalışmıyor. Alan görsel olarak devre dışı bırakılmıştır, ancak kullanıcı yine de onunla etkileşime girebilir ve etkinleştirilmiş gibi düzenleyebilir. IE'de zaten gönderilen bu hata düzeltildi, ancak henüz gönderilmedi. Bir sonraki IE ana sürümü olan connect.microsoft.com/IE/feedbackdetail/view/962368/…
Alexander Puchkov

-5

Modern tarayıcılarda basit bir çözüm var:

  1. css sınıfı tanımla

    .disabled {
      pointer-events: none;
      ... ...
    }
  2. bu sınıfı ekle ng-form

    <ng-form data-ng-class="{ 'disabled': isSaving }"> ... inputs ... </ng-form>

İşte bir işaretçi-olaylar destek grafiği.

Not: Ayarlasanız bile pointer-events: noneklavyenizle öğe girmek için sekmeye devam edebilirsiniz.

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.