2017-10-04 5 views
0

I 다음 지시문이 있습니다은 편도 지침에 바인딩

// expose directive 
     return { 
      restrict: 'E', 
      link: linkFn, 
      scope: { 
       treeModel: "<" 
      }, 
      controller: function ($scope) { 
       var vm = this; 
      }, 
      controllerAs: 'vm' 
     }; 

내가하고 싶은 것은 내 링크 기능에서 나는 다음과 같은 한, 그래서 treeModel에 변화를 감시하는 것입니다 : (이 코드는 두 번 value이 정의되어 처음 실행하지만, 두 번째 value에서 객체의 배열됩니다),하지만 난 '이후에서, $onChanges 후크를 구현하려는이 경우 작동

function linkFn(scope, element, attrs) { 
    scope.$watch('treeModel', function(value){ 
     if(value instanceof Array){ 
      scope.tree.jstree(true).settings.core.data = value; 
      scope.tree.jstree(true).refresh(); 
     } 
    }); 
} 

m plann 각도이 내 응용 프로그램을 마이그레이션 할 보내고, 그래서 나는 다음과 같은 한 :

// expose directive 
     return { 
      restrict: 'E', 
      link: linkFn, 
      scope: { 
       treeModel: "<" 
      }, 
      controller: function ($scope) { 
       var vm = this; 
       vm.$onChanges = function (changes) { 
        if($scope.treeModel instanceof Array){ 
         $scope.tree.jstree(true).settings.core.data = $scope.treeModel; 
         $scope.tree.jstree(true).refresh(); 
        } 

       }; 
      }, 
      controllerAs: 'vm' 
     }; 

을 그리고 난 내 링크 기능에서 scope.$watch 코드를 제거했습니다. 나는이 시도 할 때

, 그것은 작동하지 않고 vm.$onChangesscope.$watch와 같이 두 번째 트리거됩니다 절대 값이 정의되지 않은 경우 한 번만 트리거되지 얻을, 그리고 객체 곳이어야한다 때 changes 매개 변수는 항상 정의되지 키는 변경되는 바인딩 이름입니다.

어떻게 해결할 수 있습니까?

+0

[* Minimal, Complete, Verifiable example *] (https://stackoverflow.com/help/mcve)? –

답변

0

당신은 $에게 doCheck를 사용해야합니다 $ onChanges으로 만 참조 변경을 감시 않습니다, 그것은하지 깊은 시계를 수행합니다

See this article, which describes the replacement of a watcher with $doCheck

이 변경 사항에 대한 통지를받은위한 $ onChanges을 사용하는 것이 가능하지만 바인딩에 대한 참조가 없으므로 $ scope가없는 돌연변이에 대해서는 쉽게 수행 할 수 없습니다. $ watch