【问题标题】:jQuery find() method not working in AngularJS directivejQuery find() 方法在 AngularJS 指令中不起作用
【发布时间】:2016-02-04 03:17:01
【问题描述】:

我在使用 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);
        }
    };
});

和 HTML,例如:

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

我可以访问通过向其添加类来提供的元素。 但是,尝试访问子元素会在 var 外观中生成一个空数组。

JSFiddle demo is here.

为什么这么琐碎的事情不能正常工作?

【问题讨论】:

    标签: javascript angularjs angularjs-directive


    【解决方案1】:

    来自docs on angular.element:

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

    因此,如果您没有将 jQuery 与 Angular 一起使用,而是依赖其 jqlite 实现,则无法使用 elm.find('#someid')。

    您确实可以访问 children()、contents() 和 data() 实现,因此您通常可以找到解决方法。

    【讨论】:

    • 谢谢。在我的情况下,我实际上包含了 JQuery,但是它被包含在 angularjs 之后,这显然是问题所在。我也没有意识到 find 在 JQlite 中不可用,它没有在文档中指定!只是说“仅限按标签名称查找”,我认为这意味着 id 标签名称?
    • 所以为了澄清我的解决方法是将
    • 最后一点澄清你可以在这里看到我必须做些什么才能让它在 jsfiddle 中工作。我必须先导入 jquery,然后添加 angularjs 作为资源才能使其工作。非工作版本:link 工作版本:link
    • 我用过 jQuery(elm).find('#someid')
    【解决方案2】:

    您可以通过 2 个步骤轻松解决:

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

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

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

    【讨论】:

    • 这应该是公认的答案。它不使用 jQuery,也不强制我们要查找的元素有一个 ID。
    【解决方案3】:

    在 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

    【讨论】:

    • 这很糟糕! getElementById 将从根开始搜索整个 HTML 文档,并且不限于在模板中搜索
    • 我发现var $el = $('div.robotarm', '#container'); 在上下文中更具可读性。
    • @Spock 也许你可以使用 jsPerf 来演示? getElementById 是内部索引的,因此它不会扫描 DOM。
    • @Karl > 我想我错了。如果您专门搜索 ID,getElementByID 速度不会受此影响。
    • 感谢@Spock 的澄清,它也会对其他人有所帮助。很高兴在这里看到一个谦虚的人。
    【解决方案4】:

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

    您也可以通过姓名或 ID 访问或拨打电话,请参阅以下示例:

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

    【讨论】:

      【解决方案5】:

      我用过

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

      获取当前元素的子元素

      【讨论】:

      • jqLit​​e 不接受 children() 的选择器,您只需获取所有直接子元素。
      【解决方案6】:

      如果有人想从“控制器作为”元素中获取范围,......像这样:

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

      使用以下内容:

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

      【讨论】:

      • 不确定这有什么关系。看不到有关获取子范围或 controllerAs 语法的任何提及。可能错过了什么,很高兴被证明是错误的。
      【解决方案7】:

      你可以这样做:

       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/

      【讨论】:

      • 这个不符合你的预期:jsfiddle.net/FZGKA/167 它只是将类添加到所有孩子,选择器无关紧要
      猜你喜欢
      • 1970-01-01
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-06
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多