2013-04-14 29 views
3

我有一个包含ng-switch DOM元素的指令。我需要将事件绑定到ng-switch下的DOM节点,但由于某种原因,element.find不会返回switch元素下的任何节点!element.find不适用于ng-switch中的嵌套元素

在下面的例子中,我希望element.find("*")返回ng-switch,一个div和按钮,但它只返回ng-switch和按钮。

我该如何解决这个问题?或者以不同的方式从链接函数到达ng-switch下的DOM节点?

代码重现:

HTML

<div ng-controller="myCtrl" class="container"> 
    <div my-directive> 
     <ng-switch on="selection"> 
      <div ng-switch-when="A" class="a">A</div> 
      <div ng-switch-when="B" class="b">B</div> 
      <div ng-switch-default>default</div> 
     </ng-switch>   
     <button ng-click="switchSelection()" >switch</button> 
    </div> 
</div> 

JS

angular.module('myApp', []) 
    .directive("myDirective", function() { 
    return { 
     link: function(scope, element, attrs) { 
      console.log(element.find("*")); 
      console.log("Didn't find my divs :("); 
     } 
    } 
}); 


function myCtrl($scope) { 
    $scope.selection="B"; 

    $scope.switchSelection=function(){ 
     if ($scope.selection=="B"){ 
      $scope.selection="A"; 
     } 
     else{ 
      $scope.selection="B"; 
     } 
    } 
} 

jsFiddle example

+0

'ng-switch'只会在DOM中放置适用的元素,而不是全部。检查浏览器控制台中的实时HTML,只会看到一个DIV。你想做什么? – charlietfl

+0

不过,这意味着find()会返回一个div,而不是。 – OpherV

+4

当在角度创建的元素上使用DOM操作时,最好在'$ timeout'中包装DOM搜索代码。 http://jsfiddle.net/KCPVZ/3/。即使持续时间为零,它也会提供消化循环机会来完成 – charlietfl

回答

1

基于在评论你的问题问如何加载事件绑定图像如果'在一个开关内。

你可以做的是创建一个指令的图像,然后逻辑函数

.directive("myImageDirective", function(){ 
    return { 
     restrict: 'C', 
     link: function(scope, element){ 
      element.bind("load", function(){ 
       console.log("element loaded"); 
       scope.$apply(); 
      }); 
     } 
    }; 
}); 

的jsfiddle中的绑定加载事件:http://jsfiddle.net/kB4vq/

范围$适用()。如果你需要它,让角度知道重新处理它自己,因为负载发生在角度知识之外。您可以在这里了解更多:http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply

+0

我真的很感谢这样的努力,但是这并不能完全回答我在ng-switch里面到达元素的问题。我有几个图像,我需要执行相对于父指令中的某些逻辑的这些“加载”绑定,因此在这种情况下向图像添加指令并没有帮助。 – OpherV

+0

如果您愿意,您可以通过范围$ parent访问父母范围。所以在load元素中,你可以做一些像scope。$ parent.whatDoIDo()。至于搜索,没有超时方法你不能这样做。问题是元素还没有被创造出来。 –

+0

我在印象指示下是从下到上创建的 - 所以在这种情况下'ng-switch'会被创建并在我的指令的链接函数中可用。这不是这种情况吗? – OpherV