Angularjs: giriş [metin] ngDeğer değişirken ateşleri değiştirin


92

ngChange, değer değişirken tetikleniyor (ngChange, klasik onChange olayına benzemez). Klasik onChange olayını angularjs ile nasıl bağlayabilirim, bu sadece içerikler işlendiğinde tetiklenir?

Mevcut bağlama:

<input type="text" ng-model="name" ng-change="update()" />

Sadece benzer bir şey aradım ve sadece alan geçerli olduğunda güncellemeyi düşünmek isteyebileceğiniz aklıma geldi. Bu şekilde, kullanıcı girişi geçerli bir biçime sokmakta zorlanabilir (veya onlara istemler ve filtreler konusunda yardımcı olabilirsiniz), ardından doğru yaptıklarında bir güncelleme ile onları ödüllendirebilirsiniz!
Steve Black

Kullanılacak olayın (yalnızca bulanıklığın değil) ve diğer özelliklerin belirlenmesine olanak tanıyan çok daha esnek bir çözüm, çok yakında açısal olarak yerleşik olmalıdır: github.com/angular/angular.js/pull/2129
wired_in

Yanıtlar:


96

Bu gönderi , bulanıklık olayı tetiklenene kadar model değişikliklerini bir girişte geciktiren bir direktif örneğini gösterir .

İşte bir keman olduğunu gösteriyor yeni ng model-on-bulanıklık yönergesi ile çalışan ng-değişim. Bunun orijinal keman için küçük bir değişiklik olduğunu unutmayın .

Yönergeyi kodunuza eklerseniz, buna bağlamanızı değiştirirsiniz:

<input type="text" ng-model="name" ng-model-onblur ng-change="update()" />

Yönerge şu şekildedir:

// override the default input to update on blur
angular.module('app', []).directive('ngModelOnblur', function() {
    return {
        restrict: 'A',
        require: 'ngModel',
        priority: 1, // needed for angular 1.2.x
        link: function(scope, elm, attr, ngModelCtrl) {
            if (attr.type === 'radio' || attr.type === 'checkbox') return;

            elm.unbind('input').unbind('keydown').unbind('change');
            elm.bind('blur', function() {
                scope.$apply(function() {
                    ngModelCtrl.$setViewValue(elm.val());
                });         
            });
        }
    };
});

Not: @wjin aşağıdaki yorumlarda da belirtildiği gibi, bu özellik doğrudan Angular 1.3'te (şu anda beta sürümünde) desteklenmektedir ngModelOptions. Daha fazla bilgi için belgelere bakın .


1
Dikkat, elm.unbind ('input') Internet Explorer 8'de bir 'TypeError' atar, böylece diğer unbind deyimleri çalıştırılmaz. Elm.unbind ('input') 'u ayrı bir satıra taşıyarak çözdüm ve bir dene / yakala bloğu ile çevreledim.
Rob Juurlink

1
Angular 1.2'nin bir ng-bluryönergesi vardır: docs.angularjs.org/api/ng.directive:ngBlur
JJ Zabkar

5
Bu kodu çalıştırdım, ancak direktifin önceliğini belirlemem gerekiyordu (yani öncelik: 100). Angular 1.2.10 kullanıyorum. Tahminimce, ngModelOnblur yönergesi ngModel yönergesinden önce çalışıyordu, bu yüzden henüz çözülecek bir şey yoktu. Ayrıca bu sayfa, gelecekte bunun için yerleşik bir çözüm olabileceğini gösteriyor: github.com/angular/angular.js/pull/1783
Alan West

4
NOT En azından açısal 1.3'te bu işlevsellik, belgelereng-model-options="{ updateOn: 'default blur' }" bakın
wjin

2
@RobJuurlink (veya 'giriş'e bağlanmaya veya bağlantıyı çözmeye çalışırken IE8' TypeError 'ile karşılaşan herhangi biri) - Angular'ın kaynağına baktığınızda $sniffer, tarayıcının' girişi 'destekleyip desteklemediğini belirlemek için kullandıklarını göreceksiniz. 'keydown'a geri dönerler. Yukarıdaki yönergeyi yalnızca $sniffer.hasEvent('input')doğru döndürürse 'girdinin bağlantısını çözmek için güncellerseniz - o zaman bu hatayı önleyebilir ve yine de IE8'de çalışabilirsiniz
bvaughn

33

Bu, AngularJS'e gelecekteki yanıt olarak hizmet edecek (ayrıca başka bir soru için ) son eklemelerle ilgilidir .

(Şimdi beta 1.3 olarak) Açısal yeni sürümleri, angularjs yerel kullanarak, bu seçeneği destekliyor ngModelOptionsgibi

ng-model-options="{ updateOn: 'default blur', debounce: { default: 500, blur: 0 } }"

NgModelOptions belgeleri

Misal:

<input type="text" name="username"
       ng-model="user.name"
       ng-model-options="{updateOn: 'default blur', debounce: {default: 500, blur: 0} }" />

1.3 beta 5'te düzgün çalışmıyor, ancak mevcut ana yapı
2602'de düzeltildi

İşte bu yüzden hala beta sürümünde ve şu anda geliştirdiğim gibi "gerçek dünya" uygulamalarında kullanılamıyor.
reaper_unique

Angular 1.2.x
Fergal

8

Ek "enter" tuşa basma desteği arayan başka birinin olması durumunda, işte Gloppy tarafından sağlanan keman için bir güncelleme.

Tuşa basma bağlama kodu:

elm.bind("keydown keypress", function(event) {
    if (event.which === 13) {
        scope.$apply(function() {
            ngModelCtrl.$setViewValue(elm.val());
        });
    }
});

5

IE8 ile mücadele eden herkes için (çözmeyi ('giriş') sevmiyor, etrafında bir yol buldum.

Yönergenize $ sniffer ekleyin ve şunu kullanın:

if($sniffer.hasEvent('input')){
    elm.unbind('input');
}

Bunu yaparsan IE8 sakinleşir :)


veya sadece dene / yakala
wired_içinde

4

Bildiğim kadarıyla ng-değişimini seçme seçeneği ile kullanmalıyız ve metin kutusu durumunda ng-blur kullanmalıyız.


Şimdi doğru cevap bu, o zamanlar soru sorulduğunda, görünüşe göre mevcut değildi.
aşağı yönlü

Çok teşekkür ederim ... cevap bu olmalı
Renjith


0

OnChange davranışındaki varsayılan girdiyi geçersiz kılın (işlevi yalnızca kontrol kaybı odağı ve değer değiştiğinde çağırın)

NOT: ngChange, değer değişirken olayı tetikleyen klasik onChange olayına benzemez Bu yönerge, odağı aldığında öğenin değerini saklar
Bulanıklaştırırsa, yeni değerin değişip değişmediğini kontrol eder ve eğer öyleyse olayı tetikler

@param {String} - "onChange" tetiklendiğinde çağrılacak işlev adı

@example <input my-on-change = "myFunc" ng-model = "model">

angular.module('app', []).directive('myOnChange', function () { 
    return {
        restrict: 'A',
        require: 'ngModel',
        scope: {
            myOnChange: '='
        },
        link: function (scope, elm, attr) {
            if (attr.type === 'radio' || attr.type === 'checkbox') {
                return;
            }
            // store value when get focus
            elm.bind('focus', function () {
                scope.value = elm.val();

            });

            // execute the event when loose focus and value was change
            elm.bind('blur', function () {
                var currentValue = elm.val();
                if (scope.value !== currentValue) {
                    if (scope.myOnChange) {
                        scope.myOnChange();
                    }
                }
            });
        }
    };
});

0

Tam olarak aynı sorunu yaşadım ve bu benim için çalıştı. Ve ekleyin ng-model-updateve ng-keyupgitmeniz iyi olur! İşte dokümanlar

 <input type="text" name="userName"
         ng-model="user.name"
         ng-change="update()"
         ng-model-options="{ updateOn: 'blur' }"
         ng-keyup="cancel($event)" />
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.