как вручную скомпилировать шаблоны дважды или более

Я хочу сначала скомпилировать директиву angular, чтобы добавить атрибуты, а затем снова скомпилировать код как другие директивы. В любом случае, я могу использовать compile: pre post или что-то, чтобы скомпилировать это

присоединить атрибут к директиве к шаблонам родительской директивы?


person user2167582    schedule 23.05.2013    source источник


Ответы (1)


допустим, у вас есть директива <foo></foo> (restrict: 'E'). Вы хотите динамически добавлять атрибуты (~ изменить исходный DOM, а не шаблон), что должно быть сделано на шаге $compile директивы. После добавления атрибутов, чтобы angularjs понял, есть ли какая-либо новая директива, которую можно запустить, вы должны скомпилировать новый элемент. например, это то, что делает ng-include. он включает элементы в DOM и компилирует их, чтобы можно было использовать новые директивы.

директива foo:

compile: function ($tElement, $tAttrs) {
  var el = $tElement[0];
  el.setAttribute('bar', 'newFancyValue');
  return function (scope, element, attrs) {
     // you can even append html elements here, for example the template
     element.append("<book></book>");
     $compile(element)(scope);
  };
}

а директива barrestrict: 'A') может иметь любой код, который вы хотите.

Это связанный с этим вопрос, который вы также можете прочитать Наследование компонентов пользовательского интерфейса)

посмотрите на функцию transclude в документах, чтобы узнать, как добавить предыдущие внутренние элементы foo в book

person Eduard Gamonal    schedule 24.05.2013
comment
что, если ваша директива «foo» ограничивает «A»? кажется, в этом случае циклы компиляции навсегда.. - person Sterling Camden; 11.10.2013
comment
да, вероятно, потому что после компиляции angular снова находит атрибут, который вызвал директиву, что заставляет его компилировать ее снова и снова. Я думаю, вы можете удалить атрибут в функции компиляции и вернуть функцию ссылки, только если атрибут существует. аналогичная проблема stackoverflow.com/questions/15929386/ - person Eduard Gamonal; 11.10.2013
comment
Любая идея, почему первым параметром для компиляции $tElement является массив, а не элемент, поэтому требуется var el = $tElement[0];. В большинстве примеров это рассматривается как один объект, но, как и в OP, я получаю массив. - person Izhaki; 02.07.2014