2014-11-07 6 views
0

angularjs와 함께 이상한 상황이 발생합니다. 필자는 지시어에 대한 가치를 지니고 있으며 컨트롤러와 지시문에서이 값을 확인하고 조작 할 수 있어야합니다. 또한 컨트롤러에서 호출해야하는 지시문에 바인딩 된 객체의 속성으로 메소드가 있습니다. 이 메서드는 바인딩 된 값에 따라 반응해야합니다.angularjs - 지시어에 값이 바인딩 될 때까지 기다림

.controller('ctrl', function(){ 
    $scope.someAction = function(){ 
     $scope.myValue = undefined; 
     $scope.someObject.myMethod(); 
    }; 
}); 

.directive('myDirective', ...){ 
    return { 
     ... 
     scope: { myValue: '=', someObject: '=' }, 
     link: function (scope) { 
      scope.someObject = { 
       myMethod: function(){ 
        if (angular.isDefined(scope.myValue)){ 
         // do something 
        } 
        else { 
         // do something else 
        } 
       } 
      }; 
     } 
    } 
} 

및 컨트롤러 템플릿 : 여기

그것을 설명하기 위해 일부 의사 코드

<my-directive my-value="myValue" some-object="someObject"></my-directive> 
나는 "someAction"가 트리거 될 때, "myValue는"undefined로 설정하는 것이 기대

및 메서드 "someObject.myMethod"가 컨트롤러에서 호출되면 지시문의 "myValue"는 정의되지 않지만 그렇게하지는 않습니다. 난 그냥 1 밀리 초를 기다립니다 달러 (A $) 제한 시간에 메소드 호출을 래핑 경우, 내가 예상되는 동작을 얻을 :

.controller('ctrl', function($timeout){ 
    $scope.someAction = function(){ 
     $scope.myValue = undefined; 
     $timeout(function() { 
      $scope.someObject.myMethod(); 
     }, 1); 
    }; 
}); 

이 해킹이 내 문제를 해결했다,하지만 난 무슨 일이 일어나고 있는지 이해하는 것을 선호하고 아마도 그것을 (또는 그것을 피하는) 더 우아하게 해결할 것입니다 ...

답변

0

컨트롤러의 $ scope.someAction 함수는 $ apply 호출로 각도로 포장됩니다. 따라서 $ scope.someObject.myMethod()를 호출하면 $ apply가 끝나지 않았기 때문에 지시문의 격리 된 범위가 업데이트되지 않습니다. 당신이 제안한 것과 같은 일을하는 것이 해결책이 될 것입니다 : $timeout(function() { $scope.someObject.myMethod(); }, 0);

시간 제한은 함수를 실행하여 다음 $ apply 호출까지 지연되어 지침에 업데이트 된 값이 표시됩니다.

관련 문제