Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.02.2014, 10:53
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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

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

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

Как сделать это красиво?
Ответить с цитированием
  #2 (permalink)  
Старый 19.02.2014, 11:52
Аватар для FireVolkhov
Аспирант
Отправить личное сообщение для FireVolkhov Посмотреть профиль Найти все сообщения от FireVolkhov
 
Регистрация: 17.04.2013
Сообщений: 88

Первая строка в Гугле по запросу "add directive from compile"
Статья
Пример

Последний раз редактировалось FireVolkhov, 19.02.2014 в 11:54.
Ответить с цитированием
  #3 (permalink)  
Старый 19.02.2014, 22:12
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Не-не-не. Это было бы слишком легко. Они компилят его в функции линковки и перед этим удаляют атрибут директивы. А если на элементе несколько директив? Они по второму разу перекомпилятся, либо придется велосипедить. Еще с transclude можно. Всё пробовал. Всё криво
Ответить с цитированием
  #4 (permalink)  
Старый 20.02.2014, 07:14
Аватар для FireVolkhov
Аспирант
Отправить личное сообщение для FireVolkhov Посмотреть профиль Найти все сообщения от FireVolkhov
 
Регистрация: 17.04.2013
Сообщений: 88

Сообщение от Shitbox2 Посмотреть сообщение
А если на элементе несколько директив? Они по второму разу перекомпилятся, либо придется велосипедить.
"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);
          }
        };
      }
    };
  });
Ответить с цитированием
  #5 (permalink)  
Старый 20.02.2014, 14:10
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

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

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше защитить код от копирования на другой сайт? Опан Общие вопросы Javascript 10 21.08.2015 21:29
При нажатии на кнопку появляется другой текст ami_moor Общие вопросы Javascript 3 12.06.2015 16:56
Вставка в div другой страницы из другой папки Mr29A jQuery 1 12.11.2013 11:08
Проверить данные в функции, которая работает с другой функцией. Andrej_2 Общие вопросы Javascript 5 27.09.2012 22:42
Загрузить элементы документа с другой страницы alexrussia Events/DOM/Window 10 25.03.2011 10:17