2013-04-09 2 views
50

지시어에 대한 변경 사항을 "감시"할 수 있습니까? 그런 일 :속성 변경 사항을 '볼 수 있습니까'

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

답변

82

예. 속성에서 보간을 사용하는 경우 attr.$observe을 사용할 수 있습니다.

그러나이 보간 속성을하지 않고 당신이 응용 프로그램에서 다른 곳에서 변경 될 것으로 예상 경우 $watch 수있는 것보다, (매우 권장하지 않습니다 무엇 Common Pitfalls 읽기) 함수 리턴 :

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

어쨌든 가장 좋은 방법은 요소 클래스를 변경하는 코드를 변경하는 것입니다. 어느 순간이 바뀌지?

+1

필자는 속성으로 제한된 지시문 만 필요로하고 임의의 요소에 지시문을 추가하면 임의의 요소의 다른 속성이 변경되었을 때이를 알 수 있어야한다. 제 경우에는 클래스입니다. – Agzam

+0

클래스를 변경하는 코드를 수정하면 어쨌든 용서할 수없는 해결책이 될 수 있습니다. 클래스를 변경하는 순간 어떻게 든 요격해야합니다. – Agzam

+0

내가 게시 한'$ watch'와 함께 가십시오. 그것은 당신이 필요로하는 것을 줄 것입니다. –

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

하는 :( – Agzam

+0

흠을 작동하지 않습니다. JSFiddle을 게시 할 수 있습니까? 어떤 문제를 해결하려고하는지 확신하지 못합니다. – Ketan

+0

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

1

컨트롤러에서 변수를 볼 수도 있습니다.

이 코드는 다른 모듈이 피드백 메시지를 표시 한 후 알림 표시 줄을 자동으로 숨 깁니다.

HTML :

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

DIRECTIVE :

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

DIRECTIVE 템플릿 :

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