Я думаю, что это одна из самых сложных концепций для меня с помощью директивы angularjs.
В документе http://docs.angularjs.org/guide/directive говорится:
transclude - компилирует содержимое элемента и делает его доступным для директивы. Обычно используется с ngTransclude. Преимущество включения состоит в том, что функция связывания получает функцию включения, которая предварительно привязана к правильной области видимости. В типичной настройке виджет создает изолированную область видимости, но включение не дочерний, а родственный элемент изолированной области видимости. Это позволяет виджету иметь частное состояние, а включение может быть привязано к родительской (предизолятной) области видимости.
- true - включить содержание директивы.
- 'element' - включить весь элемент, включая любые директивы, определенные с более низким приоритетом.
Как transclude
правило, используется с ngTransclude
. Но образец из документа ngTransclude вообще не использует ngTransclude
директиву.
Я хотел бы несколько хороших примеров, чтобы помочь мне понять это. Зачем нам это нужно? Что это решает? Как это использовать?
источник
Ответы:
Рассмотрим директиву myDirective в элементе, и этот элемент включает в себя некоторый другой контент, скажем:
Если myDirective использует шаблон, вы увидите, что содержимое
<div my-directive>
будет заменено вашим шаблоном директивы. Итак, имея:приведет к этому рендеру:
Обратите внимание, что содержимое вашего исходного элемента
<div my-directive>
будет потеряно (или, точнее, заменено). Итак, попрощайтесь с этими приятелями:Итак, что, если вы хотите сохранить себя
<button>...
и<a href>...
в DOM? Вам понадобится то, что называется transclusion. Концепция довольно проста: включить контент из одного места в другое . Так что теперь ваша директива будет выглядеть примерно так:Это сделало бы:
В заключение, вы в основном используете transclude, когда хотите сохранить содержимое элемента, когда используете директиву.
Мой пример кода здесь . Вы также можете извлечь выгоду из просмотра этого .
источник
Я думаю, что важно упомянуть об изменениях в вышеуказанном поведении в новой версии AngularJS. Я потратил один час, пытаясь достичь вышеупомянутых результатов с Angular 1.2.10.
Содержимое элемента с помощью ng-transclude не добавляется, а полностью заменяется.
Таким образом, в приведенном выше примере вы могли бы добиться с помощью transclude:
и нет
Спасибо.
источник
То, что TechExplorer говорит, верно, но вы можете иметь оба содержимого, включив в свой шаблон простой тег контейнера (например, div или span) с атрибутом ng-transclude. Это означает, что следующий код в вашем шаблоне должен включать все содержимое
источник
ng-transclude
является атрибутом, который действует как заполнитель, внутри которого будет размещаться включенный контент.Из вики:
Я хотел бы добавить другое использование для transclusion, и это - то, что это изменяет порядок выполнения функций компиляции и ссылки родительских и дочерних директив. Это может быть полезно, когда вы хотите скомпилировать дочерний DOM перед родительским DOM, поскольку родительский DOM, возможно, зависит от дочернего DOM. Эта статья более углублена и проясняет это очень хорошо!
http://www.jvandemo.com/the-nitty-gritty-of-compile-and-link-functions-inside-angularjs-directives-part-2-transclusion/
источник
Обновленные AngularJS 1.6.6 документации теперь есть лучшее объяснение.
Transclude используется для создания директивы, которая охватывает другие элементы
Иногда желательно иметь возможность передавать весь шаблон, а не строку или объект. Допустим, мы хотим создать компонент «диалоговое окно». Диалоговое окно должно быть в состоянии обернуть любой произвольный контент.
Для этого нам нужно использовать опцию transclude . Обратитесь к примеру ниже.
script.js
index.html
мой-dialog.html
Скомпилированный вывод
Transclude позволяет содержимому директивы с этой опцией иметь доступ к области видимости вне директивы, а не внутри.
Это показано в предыдущем примере. Обратите внимание, что мы добавили функцию link в script.js, которая переопределяет имя как Jeff. Обычно мы ожидаем, что {{name}} будет Джефф. Однако в этом примере мы видим, что привязка {{name}} по-прежнему является Tobias.
Рекомендация : используйте только
transclude: true
тогда, когда вы хотите создать директиву для произвольного содержимого.источник
transclude: true означает добавить все элементы, которые определены в вашей директиве, с элементом шаблона вашей директивы.
Если transclude: false, эти элементы не включены в ваш окончательный HTML-код директивы, только шаблон директивы отображается.
transclude: element означает, что ваш шаблон директивы не используется, только элемент, определенный в вашей директиве, отображается как html.
когда вы определяете свою директиву, она должна быть ограничена E, а когда вы добавляете ее на страницу,
источник