2013-03-18 2 views
1

Так что я хочу, чтобы иметь возможность автору элемент следующим образом:Добавить подчиненные директивы?

<div my-directive></div> 

И я хотел бы my-directive добавить подчиненные директивы.

<div my-directive subordinate-directive></div> 

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

Пример: http://plnkr.co/edit/6y6Ebzqf1gLkTBEUcKfi?p=preview

+0

вы могли бы обеспечить plunker, было бы легче помочь –

+0

«они не получают повторный запуск на родительский элемент» - я не за тобой здесь. Можете ли вы объяснить немного больше? –

+0

Я собираюсь быть немного педантичным здесь. Это не «подчиненная директива». Это будет «директива для сестер». Я не могу найти причину, по которой вы хотели бы вставить директиву для сестры из другой директивы. Я уверен, что почти во всех случаях, когда вы пытаетесь вставить директиву из другой директивы (а затем компилируете ее), вы сможете сделать это либо в шаблоне, либо вообще не нужно делать это (т. Е. Вы можете реорганизовать это быть лучше). – ganaraj

ответ

1

Проблема заключается в том, что к тому времени моя директива обрабатывается в Collect директивы прошла фазы и изменение элемента не вызовет новую компиляцию.

Вам необходимо вручную запустить фазу компиляции после добавления всех других директив, см. plunker.

app.directive("queue", [ '$compile', function($compile) { 
    var directiveDefinitionObject; 
    directiveDefinitionObject = { 
     scope: {}, 
     controller: [ 
     '$scope', function($scope) { 
      $scope.entries = [{name: 1}, {name: 2}, {name: 3}]; 
     } 
     ], 
     template: $("#entry").html(), 
     compile : function(tElement, tAttrs, transclude) { 
     var compiler; 

     //All children related directives go here since the template hasn't been 
     //appended yet in the post link function when we re-compile 
     tElement.children().attr('ng-repeat', 'entry in entries'); 

     compiler = { 
      pre : function(scope, iElement, iAttrs, controller) { 
      }, 
      post : function(scope, iElement, iAttrs, controller) { 
      if (iElement.attr('can-do-thing-i-define') === undefined) { 
       var c = tElement.clone(); 

       c.attr('can-do-thing-i-define', ''); 

       $compile(c)(scope); 

       iElement.replaceWith(c); 
      } 
      } 
     }; 
     return compiler; 
     } 
    }; 
    return directiveDefinitionObject; 
}]); 
+0

Gracias! Пойдем немного заглянуть в мой код. – RandallB

Смежные вопросы