angularjs
  • angularjs-directive
  • angularjs-scope
  • 2014-04-08 6 views 0 likes 
    0

    <cart> 지시문 위에 마우스를 올려 놓으면 드롭 다운 목록을 표시합니다. mouseover 이벤트가 확실히 발생하고 scope.showDropdown을 true로 변경하면 <div class="cart">showDropdown의 범위를 '='으로 설정하더라도이 사실을 알지 못합니다. 저는 맞춤 지시어를 처음 접하는 사람입니다. 내가 여기서 무엇을 놓치고 있니?지시어 범위를 인식하지 못하는 내부 요소

    .directive('cart', ['Cart', function(Cart){ 
    return { 
        templateUrl: './templates/cart.html', 
        restrict: 'E', 
        scope: { 
         showDropdown: '=' 
        }, 
        link: function(scope, element, attrs){ 
         scope.showDropdown = false; 
         scope.items = Cart.getItems; 
         element.bind('mouseenter', function(){ 
          scope.showDropdown = true; 
         }); 
         element.bind('mouseout', function(){ 
          scope.showDropdown = false; 
         }) 
        } 
    } 
    }]); 
    
    app.controller('cartController', ['$scope', function($scope){ 
        $scope.showDropdown = false; 
    }]) 
    

    <cart ng-controller="cartController"> 
    Cart 
        <div class="cart" ng-show="showDropdown"> 
         <ul> 
          <li rg-repeat="item in items">{{item.name}}</li> 
         </ul> 
        </div> 
    </cart> 
    

    답변

    0

    cart.html 당신은 당신의 지시에 인수로 전달해야합니다

    <div class="cart" show-dropdown="showDropdown" ng-show="showDropdown"> 
    

    그러나 나는 최선의 해결책에 NG-쇼를 넣어하는 것입니다 생각 귀하의 템플릿. 지시어의 모든 요소를 ​​숨길 수는 없습니다. 그렇지 않으면 mouseover 이벤트를 어떻게 트리거 할 수 있습니까?

    +0

    그래, 이건 실제로 작동하는 모델입니다. 실제로 마우스를 움직이면 "카트"라는 단어가 사용되었습니다. 템플릿에서 템플릿을 생략 한 이유가 더 많습니다. 지시문은 기본적으로 후계자 컨트롤러의 범위를 공유하므로 잘못 되었습니까? 속성을 통해서만 지시문을 만들 수 있습니까? – Tules

    +0

    범위를 정의하거나 (scope : {...}) 분리 된 상태가되면 ($ parent.propName을 통해 상위 범위의 속성에만 액세스 할 수 있음) 또는 지시문에 정의한 특성을 통해 새로운 (분리되지 않은) 범위 ('scope : true')를 만들고 prototypical 상속을 통해 부모의 속성에 접근 할 수 있습니다. 새로운 범위를 만들지 않아도됩니다. –

    0

    내가 만든 변경 사항을 범위에 적용하지 못했던 것이 문제였다. 결국에는 컨트롤러 나 속성을 사용할 필요가 없었습니다.

    .directive('cart', ['Cart', function(Cart){ 
    return { 
        templateUrl: './templates/cart.html', 
        restrict: 'E', 
        scope: '=', 
        link: function(scope, element, attrs){ 
         scope.items = Cart.getItems; 
         element.bind('mouseenter', function(){ 
          scope.$apply('showDropdown = true'); 
         }); 
         element.bind('mouseout', function(){ 
          scope.$apply('showDropdown = false'); 
         }) 
        } 
    } 
    }]); 
    
    <cart> 
    Cart 
        <div class="cart ng-hide" ng-show="showDropdown"> 
         <ul> 
          <li rg-repeat="item in items" class="ng-binding"></li> 
         </ul> 
        </div> 
    </cart> 
    
    +0

    'scope : '=''는 IMHO를 의미하지 않습니다. 네가 그냥 지울 수 있다고 생각해. + 정말로 이것을하고 싶다면 CSS로 훨씬 쉽게 할 수 있습니다. '.cart .cart-items {visibility : hidden; } .cart : 커서를 가져 가면 .cart-items {visibility : visible; }' –

    관련 문제