Неправильный порядок публикации директивы Angular (1.3)

У меня есть ситуация, когда у меня есть две вложенные пользовательские директивы. Обычно функции пост-ссылки запускаются в обратном порядке, но в моем конкретном случае они запускаются сверху вниз, что не позволяет мне надежно изменять DOM. Я пытался воссоздать проблему в плункере, но это всегда правильно, поэтому я абсолютно в тупике!

<message-container> <------ The template for this directive contains the directive <scrollable-content> </message-container>

Прокручиваемый контент

return { restrict: 'E', templateUrl: 'core/app/partials/common/scrollable.html', transclude: true, replace: true, scope: true, link: function ($scope, $element, $attrs) {....

Контейнер сообщений

return { restrict: 'E', replace: true, scope: true, templateUrl: 'core/app/partials/chat/message-container.html', link: function ($scope, $element) {....

Поскольку я не могу воспроизвести это с помощью каких-либо других директив или в плункере, кто-нибудь знает какую-либо причину, как или почему это могло произойти? По сути, в моей функции связывания для контейнера сообщений я хочу добавить несколько прослушивателей событий в разметку директивы прокручиваемого содержимого. Элемент в функции ссылки для списка сообщений имеет только разметку, а не скомпилированное содержимое.

Любая помощь приветствуется!

ОБНОВЛЕНИЕ: наши шаблоны предварительно кэшируются


person Shepless    schedule 17.10.2014    source источник
comment
Используете ли вы element.bind в директиве верхнего уровня для привязки этих событий?   -  person Guillermo    schedule 18.10.2014
comment
Мы не . Это действительно поставило нас в тупик.   -  person Shepless    schedule 18.10.2014


Ответы (1)


Несколько месяцев назад я погрузился в это, это казалось неправильным. Но на самом деле в этом есть логика. templateUrl загружает шаблон асинхронно и запускает компиляцию для этих узлов после возврата шаблона. Это будет работать даже в том случае, если вы используете кешированные шаблоны. «Загрузка» tempateURL будет выполнена после того, как текущий цикл дайджеста будет готов. В самом деле, даже если шаблон уже находится в $tempateCache Об этом уже говорилось, и документация была адаптирована, чтобы сделать акцент на этом поведении.

Если вам действительно нужен порядок, используйте статические шаблоны. Или используйте такой трюк:

 template: $templateCache.get('myTemplate.html'),

Конечно, вам нужно предварительно загрузить свой шаблон, чтобы все заработало!

person Sander Elias    schedule 18.10.2014
comment
Извините, я должен был упомянуть, что наши шаблоны предварительно кэшируются, поэтому нет асинхронных запросов. - person Shepless; 18.10.2014
comment
Это не имеет значения в данной ситуации. Положительным моментом является то, что вы можете использовать трюк, который я вам показал, без дополнительных приспособлений. - person Sander Elias; 18.10.2014
comment
Я понимаю. Я попробую и доложу. Спасибо. - person Shepless; 19.10.2014
comment
Это устранило проблему. Большое спасибо за вашу помощь! - person Shepless; 19.10.2014