Вход

Просмотр полной версии : Подключение директивы в другой директиве


Shitbox2
19.02.2014, 10:53
Периодически возникает необходимость в своей директиве добавить элементу другую директиву, предварительно её настроив.

В примере пытаюсь навесить директиву тултипа:
http://plnkr.co/edit/4IvY0OZkZRdB9D1YdLBB?p=preview

Не работает из-за того, что compile вызывается после того как имеющиеся атрибуты скомпилированы.

Можно перекомпилировать шаблон в функции link, но придется заморачиваться, чтобы скомпилировался только новый атрибут. Появится куча костылей.

Как сделать это красиво?

FireVolkhov
19.02.2014, 11:52
Первая строка в Гугле по запросу "add directive from compile"
Статья (http://stackoverflow.com/questions/19224028/add-directives-from-directive-in-angularjs#answer-19228302)
Пример (http://plnkr.co/edit/pmht3qfFT5GXkGAPdLlQ?p=preview)

Shitbox2
19.02.2014, 22:12
Не-не-не. Это было бы слишком легко. Они компилят его в функции линковки и перед этим удаляют атрибут директивы. А если на элементе несколько директив? Они по второму разу перекомпилятся, либо придется велосипедить. Еще с transclude можно. Всё пробовал. Всё криво

FireVolkhov
20.02.2014, 07:14
А если на элементе несколько директив? Они по второму разу перекомпилятся, либо придется велосипедить.
"priority: 1000" и "terminal: true" обрывает сборку остальных директив в первой итерации, а в линке компилится все остальные директивы.
app.directive('myDir', function ($compile) {
return {
restrict: 'A',
replace: false,
terminal: true, //this setting is important, see explanation below
priority: 1000, //this setting is important, see explanation below
compile: function compile(element, attrs) {
element.attr('tooltip', 'example');
element.removeAttr("my-dir"); //remove the attribute to avoid indefinite loop
return {
pre: function preLink(scope, iElement, iAttrs, controller) { },
post: function postLink(scope, iElement, iAttrs, controller) {
$compile(iElement)(scope);
}
};
}
};
});

Shitbox2
20.02.2014, 14:10
У ng-repeat приоритет 1000, нужно побольше поставить. Кончено, вероятность того, что на элементе будет диретива с высшим приоритетом практически нулевая.

Надеюсь, все же, Ангулярцы перепишут директивы, чтобы они легче расширялись, т.к. сейчас это выглядит костыльно