Как передать HTML в директиву angular?

Я пытаюсь создать директиву angular с шаблоном, но я также не хочу терять HTML внутри div. Например, вот как я хотел бы вызвать свою директиву из HTML:

<div my-dir>
  <div class="contents-i-want-to-keep"></div>
</div>

Тогда есть моя директива:

app.directive('myDir', [ '$compile', function($compile) {
return {
    restrict: 'E',
    link: function(scope, iElement, iAttrs){
        // assigning things from iAttrs to scope goes here
    },
    scope: '@',
    replace: false,
    templateUrl: 'myDir.html'
};
}]);

а затем myDir.html, где я определяю новый элемент:

<div class="example" style="background: blue; height: 30px; width: 30px"></div>

Даже когда я устанавливаю для replace значение false, я теряю внутреннее содержимое div-i-want-to-keep - мое понимание угловых документов заключалось в том, что это будет добавлено после моего шаблона. Есть ли способ сохранить это (возможно, с помощью моей функции связывания?), Чтобы результат был

<div class="example" style="background: blue; height: 30px; width: 30px">
     <div class="contents-i-want-to-keep"></div>
</div>

Спасибо!


person Nicole Stein    schedule 22.05.2013    source источник
comment
вам нужно сделать translude: true и использовать ng-transclude, чтобы сохранить внутренний div   -  person Ajay Beniwal    schedule 22.05.2013
comment
@Ajaybeniwal Спасибо!   -  person Nicole Stein    schedule 22.05.2013


Ответы (1)


Вам нужно будет использовать ng-transclude, добавить transclude: true в параметры вашей директивы и добавить ng-transclude в свой шаблон:

<div class="example" style="…" ng-transclude></div>`

В этом plunkr есть пример того, как использовать ng-transclude с шаблоном, чтобы сохранить исходный элемент dom.

http://plnkr.co/edit/efyAiTmcKjnhRZMTlNGf

person Alan    schedule 22.05.2013
comment
С какой версией Angular это совместимо? - person MarzSocks; 30.03.2015
comment
@MarzSocks Я только что проверил, что он совместим с последней версией 1.3.4. Не стесняйтесь попробовать plunkr с последней версией angular и посмотреть. - person Alan; 03.04.2015
comment
В документации директивы Angular сказано, что transclude делает что-то странное с scope: transclude позволяет содержимому директивы с этим параметром иметь доступ к области за пределами директивы, а не внутри. (из docs.angularjs.org/guide/directive). Итак, может ли установка transclude: true иметь побочные эффекты, помимо разрешения мне использовать внутренний HTML-код директивы? - person DarthVanger; 08.07.2016
comment
Это работает в шаблоне? Я получаю эту ошибку: Error: [ngTransclude:orphan] Illegal use of ngTransclude directive in the template! - person zygimantus; 02.06.2017