2017-02-15 10 views
4

나는 DOM의 변화를 수행 지시문 후 컨트롤러의 메소드를 호출하고 싶지만 내가 scope.$watch지시어의 호출 컨트롤러 메서드는 범위와 작동하지만 attrs와 함께 작동하지 않습니까?

.directive('checkThis', function($timeout) { 
    return { 
     restrict: 'E', 
     scope: { 
      myData: '=', 
      dirty: '=', 
      what: '@', 
      callback: '&' 
     }, 
     link: function(scope, element, attrs) { 
      scope.$watch('myData', function(newValue, oldValue) { 
       if (newValue !== oldValue) { 
        if (newValue) { 
         scope.dirty++; 
        } else { 
         scope.dirty--; 
        } 
        check(); 
       } 
      }); 

      var check = function() { 
       if (angular.isDefined(scope.callback)) { 
        $timeout(function() { 
         console.log('being called'); 
         scope.callback(); 
        }, 0, false); 
       } 
      }; 
     } 
    }; 
}); 

내에서 호출되는 지침에서 그 방법을 보낼 수 있도록 노력하고 HTML이 지시어를 사용하지 않은 지금은 attrs.callback를 사용할 때

<check-this my-data="vm.encryption" dirty="vm.dirty" what="column" callback="vm.checkAll()"></check-this> 

아래로 실행하기 아니에요하지만 scope.callback()은 내가 attrs.callback을 확인할 때 심지어 콘솔에서 방법을 표시 실행됩니다.

왜 이런 현상이 발생합니까?

도 나는 scope.$eval(attrs.callback)
scope.$apply(function() { 
    scope.$eval(attrs.callback); 
}); 

을 시도했지만 호출하기 아니에요. 내가 참조를 받고있다 this article

답변

0

각도 지시어 attrs은 문자열이므로 attrs.callback'vm.checkAll()' 문자열을 사용자의 예제로 사용한다. $eval을 사용할 수는 있지만 응용 프로그램의 보안에 해를 끼칠 수 있으므로 권장하지 않습니다.

솔루션은 scope.callback()을 사용하는 것입니다, 당신이 그것을 사용하지 않는 몇 가지 이유가있다?

당신이 절대적으로 attrs.callback를 사용할 필요가 어떤 이유로, 당신은 scope.$parent.$eval(attrs.callback); 또는 eval('scope.$parent.' + attrs.callback) 사용할 수있는 경우

, 이러한 부모 범위 vm.checkAll()을 평가하기 때문이다. 당신의 지시가 범위를 분리 사용하고 있기 때문에

scope.$eval(attrs.callback)이 작동하지 않습니다.

+0

'scope. $ eval (attrs.callback)'을 호출 할 수 있습니다. 거기에'$ scope.'를 연결할 필요가 없습니다. –

+0

의견을 보내 주셔서 감사합니다. 당신이 완전히 정확하지는 않지만 (고립 된 범위로 인해'$ parent'가 필요합니다), 당신은 저의 실수를 깨닫도록 도와주었습니다. 답변이 수정되었습니다. –