AngularJS доступ к элементам DOM внутри шаблона директивы
есть ли более "угловой" способ выбора элементов 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");
}
}
});
я использовал селектор стиля jQuery, чтобы получить доступ к DOM <ul> элемент, отображаемый в моем шаблоне. Есть ли лучший способ сделать это?
3 ответов:
вы можете написать директиву для этого, которая просто назначает элемент (jqLite) в область, используя имя атрибута.
вот директива:
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; });использование:
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 } } });некоторые замечания:
- из-за порядок компиляции и компоновки вложенных директив вы можете получить доступ только
scope.listСmyDirectives postLink-функция, которую вы, скорее всего, используете в любом случаеngScopeElementиспользует a preLink-функция, так что директивы, вложенные в элемент, имеющийng-scope-elementуже можно получить доступscope.list- не уверен, как это ведет себя с точки зрения производительности
Я не думаю, что есть более "угловой путь", чтобы выбрать элемент. Смотрите, например, как они достигают этой цели в последнем примере эта старая страница документации:
{ 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]), // ... } }
этот ответ немного поздно, но я просто был в подобной необходимости.
наблюдая за комментариями, написанными @ganaraj в вопросе, один случай использования, в котором я нуждался,-это передача имени класса через атрибут директивы, который будет добавлен к тегу ng-repeat li в шаблоне.
например, используйте директиву следующим образом:
<my-directive class2add="special-class" />и получить следующий html:
<div> <ul> <li class="special-class">Item 1</li> <li class="special-class">Item 2</li> </ul> </div>решение найдено здесь применяется с 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"); } } });просто попробовал его успешно с AngularJS 1.4.9.
надеюсь, что это помогает.
Comments