Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Подключение директивы в другой директиве (https://javascript.ru/forum/angular/45213-podklyuchenie-direktivy-v-drugojj-direktive.html)

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"
Статья
Пример

Shitbox2 19.02.2014 22:12

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

FireVolkhov 20.02.2014 07:14

Цитата:

Сообщение от Shitbox2 (Сообщение 298454)
А если на элементе несколько директив? Они по второму разу перекомпилятся, либо придется велосипедить.

"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, нужно побольше поставить. Кончено, вероятность того, что на элементе будет диретива с высшим приоритетом практически нулевая.

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


Часовой пояс GMT +3, время: 12:03.