AngularJS访问指令模板中的DOM元素

Dus*_*tin 65 angularjs angularjs-directive

是否有更"有棱角"的方式在指令模板中选择DOM元素?例如,假设你有这个指令:

app.directive("myDirective", function() {
    return {
        template: '<div><ul><li ng-repeat="item in items"></ul></div>',
        link: function(scope, element, attrs) {
            var list = element.find("ul");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

我使用jQuery样式选择器来获取<ul>我的模板中呈现的DOM 元素.有一个更好的方法吗?

Bla*_*ole 47

我不认为选择一个元素有更多的"角度方式".例如,请参阅此旧文档页面的最后一个示例中它们实现此目标的方式:

{
     template: '<div>' +
    '<div class="title">{{title}}</div>' +
    '<div class="body" ng-transclude></div>' +
    '</div>',

    link: function(scope, element, attrs) {
        // Title element
        var title = angular.element(element.children()[0]),
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)


Cod*_*lad 40

您可以为此编写一个指令,它只是使用属性给定的名称将(jqLit​​e)元素分配给作用域.

这是指令:

app.directive("ngScopeElement", function () {
  var directiveDefinitionObject = {

    restrict: "A",

    compile: function compile(tElement, tAttrs, transclude) {
      return {
          pre: function preLink(scope, iElement, iAttrs, controller) {
            scope[iAttrs.ngScopeElement] = iElement;
          }
        };
    }
  };

  return directiveDefinitionObject;
});
Run Code Online (Sandbox Code Playgroud)

用法:

app.directive("myDirective", function() {
    return {
        template: '<div><ul ng-scope-element="list"><li ng-repeat="item in items"></ul></div>',
        link: function(scope, element, attrs) {
            scope.list[0] // scope.list is the jqlite element, 
                          // scope.list[0] is the native dom element
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

一些评论:

  • 由于嵌套指令编译和链接顺序,您只能scope.listmyDirectives postLink-Function 访问,无论如何您很可能使用它
  • ngScopeElement使用preLink函数,以便嵌套在ng-scope-element已经可以访问的元素中的指令scope.list
  • 不确定这在性能方面表现如何

  • 这是一个如此优雅的解决方案.肯定会在我当前的项目中实现这一点. (4认同)
  • 如果`myDirective`声明它自己的范围,则需要使用`scope.$ parent.list [0]`来获取该元素. (3认同)
  • 我喜欢这个主意.更清洁......我想知道性能影响是什么. (2认同)
  • 如果您想访问“ngIf”内的元素,这将不起作用,因为它们可能会丢失。 (2认同)

小智 5

这个答案来得有点晚,但我也有类似的需求。

观察@ganaraj在问题中提出的评论,我需要的一个用例是,通过指令属性传递类名,以将其添加到模板中的ng-repeat li标签中。

例如,使用如下指令:

<my-directive class2add="special-class" />
Run Code Online (Sandbox Code Playgroud)

并获取以下html:

<div>
    <ul>
       <li class="special-class">Item 1</li>
       <li class="special-class">Item 2</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

此处找到的适用于templateUrl 的解决方案是:

app.directive("myDirective", function() {
    return {
        template: function(element, attrs){
            return '<div><ul><li ng-repeat="item in items" class="'+attrs.class2add+'"></ul></div>';
        },
        link: function(scope, element, attrs) {
            var list = element.find("ul");
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

刚在AngularJS 1.4.9中成功尝试过。

希望能帮助到你。