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

Ray*_*ner 45 javascript angularjs angularjs-directive

我在使用angularjs指令找到带有注入的angular元素的子DOM元素时遇到了问题.

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

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

和HTML如:

<div ng-app="myApp">
    <div test>TEST Div
        <div id="findme"></div>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我可以通过向它添加一个类来访问被限定的元素.但是,尝试访问子元素会在var look中生成一个空数组.

JSFiddle演示就在这里.

为什么这么简单的事情不能正常工作?

sat*_*run 75

来自以下文档angular.element:

find() - 仅限于按标签名称查找

所以,如果你没有在Angular中使用jQuery,而是依赖于它的jqlite实现,你就做不到elm.find('#someid').

您也可以访问children(),contents()以及data()实现的,所以通常可以找到办法解决它.

  • 谢谢.在我的情况下,我实际上包括JQuery,但是它被包含在angularjs之后,这显然是问题所在.另外我没有认识到JQlite中没有找到它没有在文档中指定的!只是说"仅限于按标签名称查找",我认为这意味着id标签名称? (5认同)
  • 因此,为了澄清对我的修复,将<script src ="jquery">标记移动到angular <script src ="angular">标记之上. (3认同)

Fel*_*rdi 27

您可以通过两个步骤轻松解决这个问题:

1-使用querySelector到达子元素,如下所示: var target = element[0].querySelector('tbody tr:first-child td')

2- angular.element通过执行以下操作再次将其转换为对象: var targetElement = angular.element(target)

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


Zym*_*tik 13

在jQuery的日子之前你会使用:

   document.getElementById('findmebyid');
Run Code Online (Sandbox Code Playgroud)

如果这一行将为您保存整个jQuery库,那么在使用它时可能是值得的.

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

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

// Super-fast:
$( "#container" ).find( "div.robotarm" );
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Karl>我想我错了.如果您专门搜索ID,则getElementByID速度不受此影响. (8认同)
  • 感谢澄清@Spock,它也会帮助其他人.很高兴看到一个谦虚的人在这里. (6认同)
  • 这是不好的!getElementById将从根开始搜索整个HTML文档,并且不限于在模板中搜索 (5认同)
  • @Spock也许你可以使用jsPerf来演示?getElementById是内部索引的,因此它不会扫描DOM. (3认同)

小智 9

find()- 仅限于按标签名称查找,您可以查看更多信息 https://docs.angularjs.org/api/ng/function/angular.element

您也可以通过姓名或身份证或访问来访问以下示例:

angular.element(document.querySelector('#txtName')).attr('class', 'error');
Run Code Online (Sandbox Code Playgroud)