2013-08-28 3 views
0

부모 지시문의 부모에있는 변수를 기반으로 지시문을 올바르게 업데이트하려면 어떻게해야합니까?Include에있는 지시문의 AngularJS 범위

저는 서비스 호출을 통해 채워 져야하는 데이터의 개별 그리드에 대한로드를 보여주는 데 사용하려는 애니메이션 지시문이 있습니다. 현재 페이지에 대한 기본 템플릿이 있고 페이지에 표시하려는 특정 "위젯"에 대한 ng-include가 있습니다. 위젯은 채워진 정보가있는 div를 표시하거나로드 지시문에 표시됩니다. 적어도 내가 할 수 있도록하려는 것입니다.

계속 진행하고있는 $ watch는 작동하지 않는 것 같습니다. 일부 로그 문을 넣었고 "test"가 가리키는 변수를 수동으로 변경했지만 아직 실행중인 것처럼 작동합니다. 결코 바뀌지 않았다.

//One approach to the directive 
myApp.directive('loading', function() { 
    return { 
     restrict: "E", 
     scope : { 
      test : '=' 
     }, 
     templateUrl: 'partials/loading-animation.html' 
    }; 
}); 

지시문을 포함하는 포함 용 html. loadVal은 부모 상위 컨트롤러의 범위에있는 변수입니다. loadVal은 서비스 호출에 따라 변경되고 올바르게 업데이트됩니다.

<div ng-show="!loadVal" class='address store'> 
    <span>{{address.storeName}}</span> 
    <span>{{address.address1}}</span> 
    <span>{{address.city}},{{address.state}} {{address.zip}}</span> 
</div> 
<loading test="loadVal" ng-show="test"></loading> 

현재 지시문 만있는 경우에도 여전히 표시되지 않습니다. ng-switch를 사용해 보았지만 경로 변경이 없기 때문에로드 지시문과 주소 정보가 모두 표시됩니다. 또한 true 또는 false (! loadVal 및 loadVal) 중 하나를 기반으로 표시했는데 문제는 html이 표시되지 않기 때문에 "! loadVal"이 무엇인지 알 수없는 것입니다. ng-show = "! loadVal"이 켜져 있습니다.

편집가 : Plnkr

을 : 나는 그냥 잘 작동하고있어 같은데, 여기에 내가 달성하기 위해 노력했다 나타낸 plnkr이야 내가 부모의 부모를 참조 할 수 없습니다 발견 지시어 템플릿에서 ng-show (즉, ng-show = "loadVal")를 사용하여 범위를 지정하십시오. 그러나 새 변수를 만들고 범위를 양방향으로하고 해당 변수를 loadVal과 동일하게 설정하면 변경 내용이 선택됩니다.

+0

''는 실제 마크 업입니까 아니면 오타입니까? –

+0

오, 미안하지만 오타였습니다. 그것은 현재의 코드에서 그런식이 아닙니다. –

+0

문제 없습니다.문제를 나타내는 Plunker 스크립트를 만들 수 있습니까? 거기에서 디버깅하는 것이 더 쉬울 것입니다. –

답변

1

우선 ng-show 지시문의 loading 지시문의 분리 범위에있는 test 속성에 액세스하려고 시도하는 것으로 보입니다. (<loading test="loadVal" ng-show="test"></loading>) 그게 효과가 없을거야. ng-show이 실제로 코드에서 바인딩하려고하는 것은 부모 범위에 $scope.test입니다. 지시어 범위 test 속성을 가시성에 사용하려면 템플릿에서 사용하십시오.

또한 현재 지시어에 $ watch를 사용할 필요가 없으며 범위 속성을 변경하는 데 거의 scope.$apply()을 사용할 필요가 거의 없습니다. AngularJS는 $apply 호출 내에서 대부분의 코드를 래핑합니다.

이 시도 :

myApp.directive('loading', function() { 
    return { 
     restrict: "E", 
     replace: true, 
     scope : { 
      test : '=' 
     }, 
     template: '<div ng-show="test"></div>' 
    }; 
}); 

난 그냥 데모 목적을 위해 인라인 템플릿으로 templateUrl를 교체했다.

보기의 loading 지시문을 <loading test="loadVal"></loading>으로 단순화 할 수 있습니다.

+0

나는 그것을 이미 시도했지만 여전히 효과가 없다. 문제는 loadVal 변수가 실제로 상위 범위가 아니라 상위 범위의 부모입니다. 상위 컨트롤러의 범위에서이를 테스트하더라도 작동하지 않습니다. 나는 (test = "loadVal"ng-show = "test")를 지시문 요소와 템플릿 안의 div 모두에 넣으려고했지만 어느 것도 작동하지 않습니다. 재미있는 점은, 나는 또한 다른 HTML에서 그것을 참조하려고 시도하고 그것은 ng-show를 완전히 무시하고 그 내용을 보여줍니다. –

+0

아, 그래서 진짜 문제는 범위 상속이 예상대로 작동하지 않는다는 것입니다. Plunker 또는 jsFiddle을 더 많은 컨텍스트로 게시 할 수 있습니까? 우리는 부모 컨트롤러가 부모를 돕기 위해 부모의 부모와 어떻게 관련되는지 알아야합니다. –

+0

나는 그것을 알아 냈고, 어제 내가 만든 것을 보여주는 plnkr이있다. –

관련 문제