2
를 작성할 때 약속 랩핑 해제의 부족을 해결하는 방법

내가있어 몇 가지 중첩 된 지침 :중첩 된 지침

<first-directive> 
    <second-directive user="user"> 
    <third-directive name="name"> 
     <fourth-directive description="description"> 

첫 번째 지침의 템플릿이 두 번째 지침을 가지고, 두 번째 지침의 템플릿이 세 번째 지침이있다 등등. 모든 지시문에는 격리 된 범위가 있습니다.

첫 번째 지시어는 user 개체를 자체 범위에 설정합니다. 동기 방식 (예 : $scope.user = {name: "Alice"})이면 모든 것이 정상이지만 비동기 방식으로 사용자를로드하면 (예 : $http.get(url).then(function (user) { $scope.user = user }) 다른 모든 지시문이 작동하지 않습니다. 예를 들어 두 번째 지시문의 제어기 기능 user가 그 범위에 아직 설정되어 있지 않은 경우, 평가된다.

내가 지금까지 찾은 유일한 해결책은 있기 때문에, 많이 짜증, (두 번째 약속에 대한 예 $scope.$watch("user", function (user) { $scope.name = user.name}) 모든 중첩 된 약속을 $scope.$watch을 사용하는 것입니다 내가 이미 <first-directive> 안에 다른 어딘가에서 사용하는 지시문을 사용하려면 $scope.$watch을 사용하도록 다시 작성해야합니다.

다른 방법으로 해결할 수 있습니까? 첫 번째 지시어에 필요한 데이터를로드 할 수 있습니다. resolve에 사용 된 라우트의 기능이지만 라우트 나 컨트롤러를 수정하지 않고도이 지시문을 페이지에 넣을 수 있기를 원합니다.

+0

컨트롤러에서 사용자를 가져 오는 대신 경로에서 사용자를 해결하지 않는 이유는 무엇입니까? – cbass

+0

나는 지시선의 컨트롤러가 아닌 지시어의 컨트롤러에서 객체를 가져온다. 모든 페이지에 넣을 수있는 독립적 인 구성 요소를 만들고 자체적으로 필요한 데이터를 가져 오려고합니다. 어디서나 $ scope. $ watch를 추가하지 않고도 작동하도록 할 방법이 없다면, 아마 그 구성 요소가 사용 된 경로에서 데이터를 가져 오게 될 것이지만 가능하다면 그것을 피하고 싶습니다. – szimek

답변

4

100 % 확신은 사용 사례에 맞는,하지만 첫 번째 지시는 항상 사용자를로드하는 경우 템플릿의 비동기은 ng-if을 사용할 수 있습니다 : 두 번째 지침이 될 때까지 컴파일되지 않습니다

template: '<second-directive ng-if="user" user="user"></second-directive>' 

이 방법 사용자는 실제로 사용할 수 있습니다 (세 번째 또는 네 번째 지시문도 없음).

이렇게하면 $watch을 추가하지 않고도 체인에서 다른 지시문을 사용할 수 있습니다.

그리고 사용자가 이미 사용할 수있는 곳에 다른 지시어를 사용해야하는 경우 ng-if없이 사용할 수 있습니다.