2014-10-29 63 views
0

我有一个简单的指令,像这样:Angularjs - 追加与NG-显示ATTR元素指令

.directive("test", function($compile) { 
    var directive = {}; 
    directive.restrict = 'AE'; 
    directive.scope = { 
     options: '=testattr' 
    }; 
    directive.link = function(scope, element, attr) { 
     element.wrap('<div class="whatever"></div>'); 
     var el = angular.element('<div class="test" ng-show="showBar"></div>'); 
     $compile(el)(scope); 
     element.parent().append(el); 

     scope.isOverPanel = false; 
     scope.showBar = false; 
     element.on('mouseover', function(){ 
      console.log('mouseover'); 
      scope.isOverPanel = true; 
      scope.showBar = true; 
     }); 
     element.on('mouseleave', function(){ 
      console.log('mouseleave'); 
      scope.isOverPanel = false; 
      scope.showBar = false; 
     }); 
    }; 

    return directive; 
}); 

出于某种原因,在div只显示了,当我点击元素上,而不是在鼠标悬停。它也不会在mouseleave上消失。我可以在控制台看到mouseover和mouseleave事件触发。可能是什么问题呢?

回答

1

这些都不是本土角事件,所以你需要范围适用于这两种情况下(鼠标离开/鼠标悬停)

element.on('mouseleave', function(){ 
      scope.$apply(function(){ 
       scope.isOverPanel = false; 
       scope.showBar = false; 
      }); 

     }); 

这是因为你使用jQuery来注册这些事件,并因此它们未知的角度和其消化周期。

您可以尝试使用本地角度指令来执行鼠标事件。示例:https://docs.angularjs.org/api/ng/directive/ngMouseover

+0

哦!我想如果我使用jqLit​​e(不包括jQuery),它应该可以工作。我会尝试ngMouseover指令,看看它是否有效。谢谢! – Andrew 2014-10-29 00:37:58

+0

无法让它与之一起工作。 'element.wrap('

');'然后'scope.mouseOver = function(){...}'似乎不起作用。我在这里错过了什么? – Andrew 2014-10-29 00:42:00

+0

你需要绑定中的()。这里是一个例子http://stackoverflow.com/questions/22532656/ng-mouseover-and-leave-to-toggle-item-using-mouse-in-angularjs – TGH 2014-10-29 00:43:27