【问题标题】:Angularjs: how to find an element based on a data-attribute value?Angularjs:如何根据数据属性值查找元素?
【发布时间】:2014-09-08 04:37:02
【问题描述】:

我有以下指令:

template: '<div data-div="outer"><div data-div="inner"></div></div>',
link: function postLink(scope, elem, attrs) {
       var outer = elem.find('[data-div="outer"]');
       var inner = elem.find('[data-div="inner"]');
       outer.css({
           'background': 'red',
           'width': "100%",
           'height': "100%",
       });
       inner.css({
           'background': 'blue',
           'width': "50%",
           'height': "100%",
       });
    }

基于this post,我尝试了这些选择器。但我使用 jQLite,而不是 JQuery。

那么,如何根据数据属性值找到元素?

http://plnkr.co/edit/FeJWvwnKjOZwAIABigtA?p=preview

【问题讨论】:

    标签: javascript angularjs angularjs-directive jqlite


    【解决方案1】:

    您可以使用querySelector()(或querySelectorAll() 表示倍数)在使用jqLit​​e 时获得类似的find() 行为...

    function postLink(scope, elem, attrs) {
        var outer = angular.element(elem[0].querySelector('[data-div="outer"]'));
        var inner = angular.element(elem[0].querySelector('[data-div="inner"]'));
        outer.css({
           'background': 'red',
           'width': "100%",
           'height': "100%",
        });
        inner.css({
           'background': 'blue',
           'width': "50%",
           'height': "100%",
        });
    }
    

    【讨论】:

    • elem.find in plunker 应该是 angular.element...querySelector() 返回原始 DOM 元素,只需将其转回 jqLit​​e 对象。
    • angular.element(elem[0].querySelector('[data-div="outer"]'))plnkr.co/edit/Xi5q1F4iTc0qbjWEVGrK?p=preview
    【解决方案2】:

    Demo Plunker

    在 Angular 中,您很少需要使用 jQuery 选择器来查找元素。 Angular 将遍历 DOM 树并为您找到指令。

    您所要做的就是执行指令:

    app.directive('div', function() {
        return {
            restrict: 'A',
            link: function(scope, element, attr) {
                if(attr.div == 'outer') {
                   element.css({
                      'background': 'red',
                      'width': "100%",
                      'height': "100%",
                    });
                }
                if(attr.div == 'inner') { 
                   element.css({
                      'background': 'blue',
                      'width': "50%",
                      'height': "100%",
                    });
                }
            }
        }
    });
    

    如果您需要与父指令进一步交互,Angular 也可以轻松完成。您只需在指令定义中包含 require 属性,父控制器将作为第 4 个参数注入到子指令的链接函数中:

    app.directive ('parent', function() {
          return  {
             ...
             controller: function($scope, $element, $attrs) {
                 function doSomething() {
                 }
             } 
          }
    });
    
    app.directive('child, function() {
          return {
               restrict: 'A',
               require: '^parent',  // child directive requires a parent directive
               link: function(scope, element, attr, parentController) {
                   // access to the parent controller
                   parentController.doSomething();
               }
          }
    });
    

    【讨论】:

    • 然后包含jQuery,并使用它:P
    猜你喜欢
    • 2017-04-10
    • 2022-01-25
    • 2011-05-11
    • 2016-11-08
    • 2023-03-29
    • 2011-12-16
    相关资源
    最近更新 更多