AngularJS – 用属性查找元素
我是AngularJS的新手。 我已经了解到,我可以使用如下查询在DOM中查找元素:
var e = angular.element(document.querySelector('#id')); var e = angular.element(elem.querySelector('.classname'));
这对于通过ID或CSS类名查找元素非常有用。 但是,我需要能够find一个元素使用不同的方法。 我有一个如下所示的元素:
<div my-directive class='myContainer'>...</div>
我无法在“myContainer”上查询,因为它的重用程度如何。 出于这个原因,我想find任何具有“my-directive”属性的元素。 如何searchDOM并find任何使用“my-directive”的元素?
而不是查询元素的DOM(这不是非常angular度,如果我有一个jQuery背景,请参阅“在AngularJS中思考” ),您应该在您的指令中执行DOM操作。 该元素在您的链接function中可用。
所以在你的myDirective
return { link: function (scope, element, attr) { element.html('Hello world'); } }
如果您必须在指令之外执行查询,那么在现代浏览器中可以使用querySelectorAll
angular.element(document.querySelectorAll("[my-directive]"));
但是,你需要使用jQuery来支持IE8和向后
angular.element($("[my-directive]"));
或者像这里演示的那样编写你自己的方法在没有使用库的情况下querySelectorAll不可用时,通过属性获取元素?
你的用例还不清楚。 但是,如果您确定需要基于DOM而不是模型数据,则这是一个指令对所有指定了其他指令的元素的引用方式。
方式是子指令可以require
父指令。 父指令可以公开一个允许直接指令向父指令注册元素的方法。 通过这个,父指令可以访问子元素。 所以,如果你有一个模板:
<div parent-directive> <div child-directive></div> <div child-directive></div> </div>
那么指令可以被编码如下:
app.directive('parentDirective', function($window) { return { controller: function($scope) { var registeredElements = []; this.registerElement = function(childElement) { registeredElements.push(childElement); } } }; }); app.directive('childDirective', function() { return { require: '^parentDirective', template: '<span>Child directive</span>', link: function link(scope, iElement, iAttrs, parentController) { parentController.registerElement(iElement); } }; });
你可以在http://plnkr.co/edit/7zUgNp2MV3wMyAUYxlkz?p=preview看到这一点;
你没有说明你在找什么元素。 如果它在控制器的范围之内,尽pipe合唱你会听到它不是'angular度的方式',也是可能的。 合唱是对的,但有时候,在现实世界中,这是不可避免的。 (如果您不同意,请联系我 – 我对您有挑战。)
如果将$element
传递给控制器,就像$scope
,可以使用它的find()
函数。 请注意,在Angular中包含的jQueryLite中, find()
只能按名称定位标签,而不能定位标签。 但是,如果在项目中包含完整的jQuery,则可以使用find()
所有function,包括按属性查找。
所以,对于这个HTML:
<div ng-controller='MyCtrl'> <div> <div name='foo' class='myElementClass'>this one</div> </div> </div>
这AngularJS代码应该工作:
angular.module('MyClient').controller('MyCtrl', [ '$scope', '$element', '$log', function ($scope, $element, $log) { // Find the element by its class attribute, within your controller's scope var myElements = $element.find('.myElementClass'); // myElements is now an array of jQuery DOM elements if (myElements.length == 0) { // Not found. Are you sure you've included the full jQuery? } else { // There should only be one, and it will be element 0 $log.debug(myElements[0].name); // "foo" } } ]);