Angularjs:如何根据数据属性值查找元素?

时间:2014-09-08 04:37:02

标签: javascript angularjs angularjs-directive jqlite

我有以下指令:

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

2 个答案:

答案 0 :(得分:5)

使用jqLit​​e时,您可以使用querySelector()(或querySelectorAll()作为倍数)来获得类似的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%",
    });
}

答案 1 :(得分:0)

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();
           }
      }
});