Я пытаюсь создать директиву, которая заботится о добавлении дополнительных директив к элементу, который он объявлен.
Например, я хочу создать директиву, которая позаботится о добавлении datepicker
, datepicker-language
и ng-required="true"
.
Если я попытаюсь добавить эти атрибуты, а затем использовать $compile
, я, очевидно, создаю бесконечный цикл, поэтому я проверяю, добавили ли я уже необходимые атрибуты:
angular.module('app')
.directive('superDirective', function ($compile, $injector) {
return {
restrict: 'A',
replace: true,
link: function compile(scope, element, attrs) {
if (element.attr('datepicker')) { // check
return;
}
element.attr('datepicker', 'someValue');
element.attr('datepicker-language', 'en');
// some more
$compile(element)(scope);
}
};
});
Конечно, если я не $compile
элемент, атрибуты будут установлены, но директива не будет загружена.
Является ли этот подход правильным или я делаю это неправильно? Есть ли лучший способ достичь такого же поведения?
UDPATE: учитывая тот факт, что $compile
- единственный способ добиться этого, есть ли способ пропустить первый прогон компиляции (элемент может содержать несколько дочерних элементов)? Возможно, установив terminal:true
?
ОБНОВЛЕНИЕ 2. Я попытался поместить директиву в элемент select
, и, как и ожидалось, компиляция выполняется дважды, что означает, что в два раза больше ожидаемых option
s.