2016-12-04 1 views
0

컨트롤러와 상호 작용하기 위해 지시문 api 노출 문제가 발생했습니다.각도 : templateUrl을 사용하면 지시문에서 컴파일 링크 순서가 깨집니다.

내 구조를 설명하는 간단한 jsfiddle이 있습니다.

문제는 지시어 (I 위의 바이올린에 template으로 대체), 그것은로드 템플릿 비동기로 (this question에 따라 올바른 동작을) 리드 templateUrl 속성을 가지고 있다는 것입니다. 그 결과 지시어의 컨트롤러로

은 (당신이 $ 시간 제한 같은 콜을 포장하는 경우에도) 메인 컨트롤러, 따라서 지침의 API 함수 doWork이 정의 된 후에 호출됩니다에 오는 방법이있다

.controller('MainCtrl', function($scope, $timeout) { 
    $scope.api = {}; 

    $scope.init = function() { 
    $timeout(function() { 
     $scope.api.doWork(); 
    }) 
    } 

    $scope.init() 
}) 

내 mind - use 이벤트를 지시자의 링크 함수에 넣고 해당 이벤트에 $scope.api.doWork을 구독하십시오. 하지만 이벤트 사용에 만족하지 않습니다. api 노출과 비슷한 방법으로 서로 중첩 된 지시어가있는 경우에도 이러한 경우를 처리하는 방법이 명확하지 않습니다. 한편 templateUrltemplate으로 바꿀 수는 있지만 템플릿의 복잡한 레이아웃의 경우에는 매우 나쁜 결정입니다.

따라서 이러한 종류의 문제를 해결할 수있는 방법을 조금 고수했습니다. 그것을 해결하는 가장 좋은 방법은 무엇입니까? 아마 지시어의 api를 공개하는 또 다른 기술이 있습니다. (Andrej Kaurin의 답변은 thread입니다.)

답변

1

각도 1.5 이상을 사용하고 있고 구성 요소를 사용하는 경우 $postLink 또는 $onInit 기능 link을 사용해보십시오. 그렇지 않다면 onDoWork 지시어 범위 속성을 만든 다음 doWork이 실제로 실행될 때 해고 될 주 컨트롤러의 일부 기능을 적용해야합니다. (지시어가 doWork 일 때 제어해야한다고 생각하기 때문에 서비스를 만들어야합니까?)

관련 문제