jquery find()方法在AngularJS指令中不起作用

问题描述:

我在使用注入角元素查找子DOM元素的angularjs指令时遇到了问题。jquery find()方法在AngularJS指令中不起作用

例如我有一个指令,像这样:

myApp.directive('test', function() { 
    return { 
     restrict: "A", 
     link: function (scope, elm, attr) { 
      var look = elm.find('#findme'); 
      elm.addClass("addedClass"); 
      console.log(look); 
     } 
    }; 
}); 

和HTML如:

<div ng-app="myApp"> 
    <div test>TEST Div 
     <div id="findme"></div> 
    </div> 
</div> 

我有权访问其通过将一类给它proffed的元素。 但是,尝试访问子元素会在var外观中产生一个空数组。

JSFiddle demo is here

为什么这么微不足道的东西不能正常工作?

docs on angular.element

find() - 如果你不使用jQuery有棱有角,但依靠其jqlite实现由标签名

所以仅限于查询,你不能做elm.find('#someid')

您可以访问children()contents()data()实现,所以您通常可以找到解决方法。

+4

谢谢。在我的情况下,我实际上包括JQuery,但它被包含在angularjs之后,这显然是问题所在。 此外,我没有认识到在JQlite中找不到它,它没有在文档中指定它!只是说“仅限于通过标签名称查找”,我认为这意味着id标签名称? – 2013-02-14 01:06:47

+2

因此,要澄清对我的修复是将

+0

最后一点澄清 你可以在这里看到我必须做些什么才能让它在jsfiddle中工作。 我必须先导入jquery,然后添加angularjs作为资源才能使其工作。 Non-working rev:[link](http://jsfiddle.net/raygarner/FZGKA/7/) working rev:[link](http://jsfiddle.net/raygarner/FZGKA/8/) – 2013-02-14 01:14:38

的jQuery的日子之前,你可以使用:

document.getElementById('findmebyid'); 

如果这一行会救你一整个jQuery库,它可能在使用它,而不是值得。

对于那些关心性能的人: 用ID开始选择器总是最好的,因为它使用本地函数document.getElementById。

// Fast: 
$("#container div.robotarm"); 

// Super-fast: 
$("#container").find("div.robotarm"); 

http://learn.jquery.com/performance/optimize-selectors/

jsPerf http://jsperf.com/jquery-selector-benchmark/32

+5

这是不好的! getElementById将搜索从根开始的整个HTML文档,并且不限于在模板中搜索 – Spock 2014-07-22 22:34:21

+0

我发现'var $ el = $('div.robotarm','#container');'在给定上下文的情况下更具可读性。 – Dementic 2014-12-01 11:01:55

+3

@Spock也许你可以使用jsPerf来演示? getElementById是内部索引的,所以它不会扫描DOM。 – Zymotik 2015-08-17 10:53:06

find() - 通过标签名称 你可以看到更多信息 https://docs.angularjs.org/api/ng/function/angular.element

您也可以通过名称或ID,或致电访问仅限于查询请以下示例:

angular.element(document.querySelector('#txtName')).attr('class', 'error'); 

我用

elm.children('.class-name-or-whatever') 

来获得当前元素的子

+10

jqLit​​e不接受children()的选择器,你只需要获得所有的直接子元素。 – Frankey 2015-06-17 19:08:38

+0

http://jsfiddle.net/FZGKA/167/ – ShaneK 2015-12-30 20:35:41

可以轻松解决,在2个步骤:

1-达到预定可使用querySelector这样子元素: var target = element[0].querySelector('tbody tr:first-child td')

2-再次将它转换为angular.element对象ing: var targetElement = angular.element(target)

然后,您将可以访问targetElement变量上的所有预期方法。

+1

这应该是被接受的anwser。它不使用jQuery,也不会强制我们想要查找的元素具有ID。 – kboom 2015-10-13 06:50:56

+0

这是一个很好的答案..干得好 – Arcagully 2015-11-04 14:47:21

+0

这节省了我很多时间,谢谢。 – Liz 2016-07-25 05:39:52

你可以这样说:

var myApp = angular.module('myApp', []) 
    .controller('Ctrl', ['$scope', function($scope) { 
    $scope.aaa = 3432 
}]) 
.directive('test', function() { 
    return { 
     link: function (scope, elm, attr) { 
      var look = elm.children('#findme').addClass("addedclass"); 
      console.log(look); 
     } 
    }; 
}); 

<div ng-app="myApp" ng-controller="Ctrl"> 
    <div test>TEST Div 
     <div id="findme">{{aaa}}</div> 
    </div> 
</div> 

http://jsfiddle.net/FZGKA/133/

+0

这一个不像你所期望的那样工作:http://jsfiddle.net/FZGKA/167/它只是将该类添加到所有的孩子,选择器并不重要 – ShaneK 2015-12-30 20:34:48

如果有人正在抢关范围内一个“控制器”元素的..这样的事情:

<div id="firstctrl" ng-controller="firstCtrl as vm"> 

使用以下内容:

var vm = angular.element(document.querySelector('#firstctrl')).scope().vm; 
+0

不知道这是如何相关。看不到有关获取子范围或控制器语法的任何提及。可能错过了某些东西,很高兴被证明是错误的。 – perry 2016-05-03 06:06:48