2015-04-17 20 views
7

içinde yalnızca bir kez ateş ediyor, bu yüzden bazı biri bana out.I yardım burada şablon var: Lütfen

<form ng-model="signup" form-valid> 
    <input type="text" name="username" ng-model="signup.username">{{signup}} 
</form> 

Ve yönergesi şu şekildedir:

app.directive("formValid",function(){ 

return { 
    restrict:"A", 
    require:"ngModel", 
    link:function(scope,element,attrs){ 
      scope.$watch(attrs.ngModel,function(newValue){ 
       if(newValue){ 
       console.log(newValue); 
       } 
      }); 
     } 
    }}); 

Metin kutusuna herhangi bir değer girdiğimde, model değişiyor ve buna göre "$ watch" işlemi başlatılmalıdır. Ancak burada "$ watch", sadece ilk defa metin kutusuna herhangi bir değer girdiğimde bir defa atılır. .Şimdiden teşekkürler.

+1

Muhtemelen, sadece nesnenin kendisinin değil, modelinizin özelliklerini de izlemek istersiniz: 'scope. $ Watch (attrs.ngModel, {…}, true);' – Blackhole

+0

Benim için çalışır. Bu üçüncü argüman nedir? ' "Gerçek" olmadan "doğru" yapar.Previuosly sadece bir kez ateş ediyordu. – Nitya

+0

Üçüncü argüman "derin" izlemek ya da değil. örneğin aynı nesneyi kontrol edin veya nesnenin tüm aynı anahtar/değerlere sahip olduğunu kontrol edin – dogmatic69

cevap

-1

Aşağıdaki örnekte ngModel benzeri bir çözüm kullanmak olacaktır.

app.directive("formValid",function(){ 
    return { 
    restrict: 'A', 
    require: 'ngModel', 
    link: function(scope, element, attrs, ngModel) { 
     scope.$watch(function() { 
      return ngModel.$modelValue; 
     }, function(newValue) { 
      console.log(newValue); 
     }); 
     } 
    } 
    }); 

Düzenleme: hızlı çözüm Blackhole tarafından yorumunu takip etmek ve true ekleyerek derin izlemek için saatinizi güncellemek olacaktır. Bunun nedeni, signup özniteliğini izlediğiniz, ancak username model değerinin kaydolma özelliğidir. Derin saat özellikleri izlemek için hizmet edecektir.

attrs aracılığıyla veya attrs aracılığıyla ya da biçimlendiricileri veya ayrıştırıcıları kullanarak (Michaels yanıtında ayrıntılı olarak görüldüğü üzere daha iyi bir çözümdür). Eğer ngModelController kullandığınızda

+1

OP, 'attrs.ngModel' içeriğini, yani 'signup' içeriğini izliyor, bu da miras yoluyla bir kapsam değişkeni. – Blackhole

+0

Evet yeterince adil, ben miras kalan kapsamları ile karışıklık denemek ve önlemek için bağlantı işlevinde attrs attrs kullanarak ayrımını yapmaya çalışıyordum. Cevabımı güncelleyeceğim ama Michael iyi bir çözüm sağladı. Teşekkürler. – Asta

+0

Teşekkürler Asta.I watcher için bir "true" ekledi.Şimdi çalışıyor – Nitya

3

, model üzerinde değişiklikler izlemek için standart bir yol formatter oluşturmaktır:

link: function(scope, element, attrs, ngModelCtrl) { 
    ngModelCtrl.$formatters.push(function(value) { 
     // Do something with value 
     return value; 
    }); 
} 

modeli doğrudan değiştirildiğinde biçemleyicileri sadece tetiklenir unutmayın. Değişiklik kullanıcı arayüzünden geliyorsa (yani kullanıcı bir şeyi değiştirir), bunun yerine ayrıştırıcıları tetiklenir. Yani siz de bunu yapmak gerekebilir:

ngModelCtrl.$parsers.push(function(value) { 
    // Do something with value 
    return value; 
}); 

Working Plunker

Size o boru hatları işe tam olarak nasıl çalıştığını anlamak böylece ngModelController belgeleri okumak düşündürmektedir.

scope: { model: '=ngModel' }, 
link: function(scope) { 
    scope.$watch('model', function(value) { 
     // Do something with value 
    }); 
} 

Working Plunker

:

Fakat modeli değişiklikleri (istediğiniz veya ne formata gerek ne de herhangi bir şey ayrıştırmak yoktur), o zaman daha basit bir şey yapabilirsiniz yapmak istediğiniz tüm haberdar olsun eğer

Ancak yönergelerinizin adı olan formValid verildiğinde, ngModelController'ın kullanılması doğru yaklaşımdır.

GÜNCELLEME

O ngModelController tartışmasız bir eksiklik olduğunun altını çizmekte fayda var: Bu "referans" türleri (örn diziler, nesneler) ile çok iyi çalışmaz. Bunun hakkında daha fazla bilgi here bulunabilir.

+0

Teşekkür ederim Michael.But bilmek istediğim bir şey.Bir bekçi modele "true" olarak üçüncü bir parametre ekledim an modelini izlemeye başladım.Ama daha önce neden sadece bir kez ateş edildi? Aşağıdaki kod benim için çalışıyor kapsamı. $ Watch ('model', işlev (değer) { // değerine sahip bir şeyler yapın}, true); – Nitya

+0

@Nitya Üçüncü bağımsız değişken, Angular'ın değerleri karşılaştırmak için 'angular.equals' kullanmasını söyler (yani derin bir karşılaştırma yapar). Bir nesneyi izlemeniz ve özelliklerinden biri değiştiğinde bildirim almanız gerekiyorsa, bu parametreyi ayarlamanız gerekir (bazı performans karşılığında). Bu, ngModelController'ın bir kusurudur: bu tür bir karşılaştırma yapmaz ve bu nedenle "değer türleri" ile daha iyi çalışır. –

+0

@Nitya Saatin sadece bir kez ateş etmesi bekleniyor. Her saat en az bir kez (izlenen özellikte hiçbir değere sahip değilse, tanımlanmamış argümanlarla) çalışır. [Bu plunker] 'da görebileceğiniz gibi (http://plnkr.co/edit/2qWMhOkTSH403i6k0ti0?p=preview). –

İlgili konular