【问题标题】:element.find does not work for nested elements inside ng-switchelement.find 不适用于 ng-switch 中的嵌套元素
【发布时间】:2013-04-14 16:10:35
【问题描述】:

我有一个包含ng-switch DOM 元素的指令。我需要将事件绑定到 ng-switch 下的 DOM 节点,但由于某种原因 element.find 不会返回 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

【问题讨论】:

  • ng-switch 只会在 DOM 中放置适用的元素,而不是所有元素。在浏览器控制台中检查实时 html,只会看到一个 DIV。你想做什么?
  • 不过,这意味着 find() 将返回一个它不会返回的 div。
  • 在对 Angular 创建的元素使用 DOM 操作时,最好将 DOM 搜索代码包装在 $timeout 中。 jsfiddle.net/KCPVZ/3。即使持续时间为零,它也有机会完成摘要循环
  • 对于你想要做的事情来说,直接 DOM 操作真的有必要吗? Angular 通常会提供一种更简单的方法。
  • @Rosarch 最终目标是在我的ng-switch下的指令中绑定一些图片的加载事件。否则您将如何访问图像元素并从链接函数绑定“加载”事件?

标签: javascript jquery angularjs angularjs-directive


【解决方案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/

范围.$apply();如果你也需要它,就是让 Angular 知道重新处理自己,因为负载发生在 Angular 的知识之外。你可以在这里阅读更多内容:http://docs.angularjs.org/api/ng.$rootScope.Scope#$apply

【讨论】:

  • 我非常感谢您的努力,但这并不能完全回答我关于在ng-switch 中获取元素的问题。我有几个图像,我需要相对于父指令中的某些逻辑执行这些“加载”绑定,因此在这种情况下向图像添加指令无济于事。
  • 如果您愿意,可以通过 scope.$parent 访问父范围。因此,在加载元素中,您可以执行诸如 scope.$parent.whatDoIDo() 之类的操作。至于搜索,不,如果没有超时方法,您将无法做到这一点。问题是那时还没有创建元素。
  • 我的印象指令是自下而上创建的——所以在这种情况下,ng-switch 将被创建并在我的指令的链接函数中可用。这里不是这样吗?
  • 它可用,问题是它还没有创建。 Javascript 和 dom 操作(通过 ng-switch 放入元素)发生在不同的时间。 javascript首先发生,这就是您找不到元素的原因。 dom 插入将在之后进行。这就是为什么 $timeout 将是做你想做的事情的方式。不管 Angular 的一般原则是不进行 dom 搜索。使用我上面描述的指令方法以及 scope.$parent 应该涵盖您的情况。如果不是,我可以帮助弄清楚你想做什么。如果可能的话,创建一个 jsfiddle。
猜你喜欢
  • 1970-01-01
  • 2014-10-29
  • 1970-01-01
  • 2018-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多