2013-04-09 17 views
50

E' possibile "guardare" i cambiamenti ui sulla direttiva? qualcosa di simile:E 'possibile modificare gli attributi di' watch '

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

risposta

82

Sì. È possibile utilizzare attr.$observe se si utilizza l'interpolazione sull'attributo.

Ma se questo non è un attributo interpolato e si aspettano di essere cambiato da qualche altra parte nel ricorso (ciò che non è estremamente consigliato, leggere Common Pitfalls), di quanto si possa $watch un ritorno funzione:

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

In ogni caso, è probabile che l'approccio migliore per te sia modificare il codice che modifica la classe di elementi. In quale momento viene cambiato?

+1

Ho solo bisogno di una direttiva limitata ad un attributo e quando aggiungo la direttiva a qualsiasi elemento arbitrario, dovrebbe essere in grado di dire quando sono cambiati altri attributi di quell'elemento arbitrario. Nel mio caso è 'classe' – Agzam

+0

modificare il codice che cambia classe sarebbe in qualche modo una soluzione inaccettabile per me, anche se probabilmente la cosa più giusta da fare. Devo ancora intercettare in qualche modo il momento in cui cambia la classe – Agzam

+0

Quindi andare con il '$ watch' che ho postato. Darà ciò di cui hai bisogno. –

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

non funziona :( – Agzam

+0

hmmm. puoi pubblicare un JSFiddle? Non sei sicuro di quale problema stai cercando di risolvere. – Ketan

+0

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

1

È anche possibile vedere la variabile nel controller.

Questo codice nasconde automaticamente la barra di notifica dopo che un altro modulo visualizza il messaggio di feedback.

HTML:

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

DIRETTIVA:

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

DIRETTIVA MODELLO:

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