2013-04-09 16 views
50

Direktif üzerindeki ui değişiklikleri için "izlemek" mümkün mü? Böyle şey:'İzlenecek' özellikler 'izlenmesi mümkün mü

.directive('vValidation', function() { 
    return function(scope, element, attrs) { 
     element.$watch(function() { 
      if (this.hasClass('someClass')) console.log('someClass added'); 
     }); 
    } 
}) 

cevap

82

Evet. Öznitelikte enterpolasyon kullanırsanız attr.$observe'u kullanabilirsiniz.

Ama bu bir ara değerli nitelik değildir ve bunu uygulamada başka bir yerden değişeceğini umuyoruz eğer $watch can daha (son derece tavsiye edilmez ne Common Pitfalls okuyun) bir işlev dönüş:

scope.$watch(function() { 
    return element.attr('class'); 
}, function(newValue){ 
    // do stuff with newValue 
}); 

Her neyse, muhtemelen sizin için en iyi yaklaşımın, öğe sınıfını değiştiren kodu değiştirmesidir. Hangi an değişti?

+1

göründüğü kadar kolay değil gibi görünüyor Sadece bir öznitelikle sınırlı bir yönerge ihtiyacım var ve yönergeyi herhangi bir rasgele öğeye eklediğimde, bu isteğe bağlı öğenin diğer özniteliklerinin ne zaman değiştiğini anlayabilmelidir. Benim durumumda, sınıfın değiştirileceği kodu değiştiren kod – Agzam

+0

benim için kabul edilemez bir çözüm olsa da, muhtemelen en doğru şey. Yine de, – Agzam

+0

sınıfını değiştirdiği andan sonra bir şekilde kesişmem gerekiyor. Sonra gönderdiğim "$ watch" ile devam edin. İhtiyacın olanı verecek. –

33
attrs.$observe('class', function(val){}); 
+3

:( – Agzam

+0

hmmm çalışmıyor. JSFiddle gönderebilir misin? Sorunu çözmeye çalıştığınızdan emin değilsiniz. – Ketan

+0

http://jsfiddle.net/aW9dU/2/ – Agzam

1

Ayrıca denetleyicideki değişkenleri de izleyebilirsiniz.

Bu kod, başka bir modül geribildirim mesajını görüntüledikten sonra bildirim çubuğunu otomatik olarak gizler.

HTML:

<notification-bar 
    data-showbar='vm.notification.show'> 
     <p> {{ vm.notification.message }} </p> 
</notification-bar> 

DİREKTİFİ:

var directive = { 
    restrict: 'E', 
    replace: true, 
    transclude: true, 
    scope: { 
     showbar: '=showbar', 
    }, 
    templateUrl: '/app/views/partials/notification.html', 
    controller: function ($scope, $element, $attrs) { 

     $scope.$watch('showbar', function (newValue, oldValue) { 
      //console.log('showbar changed:', newValue); 
      hide_element(); 
     }, true); 

     function hide_element() { 
      $timeout(function() { 
       $scope.showbar = false; 
      }, 3000); 
     } 
    } 
}; 

DİREKTİFİ TEMPLATE:

<div class="notification-bar" data-ng-show="showbar"><div> 
    <div class="menucloud-notification-content"></div>