2014-02-17 38 views
0

我在構建使用其內容作爲模板的指令時遇到了問題。在這種特殊情況下,該指令正在調用一個web服務來獲取一些子元素。內部html可能會或可能不會有ng重複。以下是部分,歸結爲簡化它們:使用其內容作爲模板的指令

<div my-children="1"> 
    {{children.length}} 
     <ul> 
     <li ng-repeat="kid in children"> 
      {{kid.name}} 
     </li> 
     </ul> 
</div> 

我的期望是,無論是具有指令屬性會被編譯並使用該模板的元素中。

的指令(簡體)是:

app.directive('myChildren', function($compile, $timeout) { 
    return { 
    restrict: 'A', 
    scope: { 
     myChildren: '=' 
    }, 
    compile: function(tElement, tAttrs, transclude) { 
     tElement.append(transclude(tElement)); 
    }, 
    link: function(scope, element, attr) { 
     scope.children = []; 

     scope.safeApply = function(fn) { 
     var phase = this.$root.$$phase; 
     if (phase == '$apply' || phase == '$digest') { 
      if (fn && (typeof(fn) === 'function')) { 
      fn(); 
      } 
     } else { 
      this.$apply(fn); 
     } 
     }; 

     scope.$watch('myChildren', function(newVal) { 
     if (!newVal) return; 
     // mock our service call with timeout 
     $timeout(function() { 
      scope.children = [{ 
      id: 1, 
      name: "one" 
      }, { 
      id: 2, 
      name: "two" 
      }]; 
      scope.safeApply(); 
     }, 400) 

     }); 
    } 
    } 

}) 

這是一個非工作的例子:http://plnkr.co/edit/ZidQ4oBdpYxdg5Fyqe0P?p=preview

回答

0

試試這個

Example using directive template

我沒有使用transclude,我通常把我所有的html都放在模版或模版中

如果我需要'動態'改變我的html基礎,我會建立一個不同的指令,並使用ng-switch或ngShow/ngHide它更容易調試

+0

雖然它的工作原理,它並沒有回答我關於使用指令元素的內容爲模板的問題。 – lucuma

+0

通過使用transclude,您可以訪問指令範圍的「外部」。 transclude只是用指令模板包裝html。在您的頁面上的HTML範圍可用於您的控制器 - 而不是您的指令 - 這就是爲什麼它不起作用 –

+0

我試過各種不同的情況下,能夠使用指令元素的內容作爲模板。那只是最後一次迭代,只是決定離開它。 – lucuma