2016-05-17 29 views
1

我有一個自定義的角度指令包裝一個HTML元素:如何作爲一個屬性添加一個角指令子節點

<my-directive-1> 
    <div some-attribute="some value">My original content</div> 
</my-directive-1> 

代碼編譯添加另一個指令,以子節點的屬性:

<div some-attribute="some value" my-directive-2>My original content</div> 

這樣myDirective2的控制器將在子節點上被觸發。

這怎麼辦?

+0

任何機會,你可以在'myDirective1'指令提供的代碼,這樣我可以給你如何可以做到這一點工作的例子嗎? – Fizzix

+0

那麼,我基本上重寫它只完成這項任務。我在我的應用中棄用''myDirective1''',以便將來的用戶只需在基本元素上使用''myDirective2''',而不是使用''myDirective1'''作爲容器。這樣做的目標是允許向後兼容,以便人們升級時不必重構他們的代碼。 – Matt

+0

太容易了。檢查我的答案,應該解決你的問題。 – Fizzix

回答

0

在這種情況下使用$compile,這樣Angular知道它是一個指令。 Angular會編譯這個,承認有些東西需要爲範圍編譯,例如指令,數據和其他東西。

首先,用新的HTML覆蓋HTML元素。其次,使用$compile來編譯與Angular相關的新內容,與scope相關。

app.directive('myDirective1', ['$compile', function ($compile) { 
    return { 
     link: function (scope, element) { 
      element.html('<div some-attribute="some value" my-directive-2>My second content</div>');    
      $compile(element.contents())(scope); 
     } 
    } 
}]); 

app.directive('myDirective2', ['$compile', function ($compile) { 
    return { 
     link: function (scope, element) { 
      element.html('<div some-attribute="some value">My final content after two directives</div>'); 
      $compile(element.contents())(scope); 
     } 
    } 
}]); 

WORKING EXAMPLE

+0

好的,''compile'''確實讓我走上正軌,但我想保留'''div'''上可能存在的任何其他屬性。而不是'''element.html(...)'''我試過'''element' [0] .querySelector('div')。setAttribute('my-directive-2','')'''和然後運行$ compile,這實際上可以工作,但它會導致'''div ... my-directive-2 =「」>'''。有沒有其他方法可以動態地將'''my-directive-2'''屬性添加到'''div'''? – Matt

+0

@Matt - 所以你的問題是如何在元素上使用'my-directive-2'而不是'my-directive-2 =「」'? – Fizzix

+0

是的,差不多。我看到的所有接受的答案都使用了我正在使用的setAttribute方法,但似乎是將一個空字符串添加爲指定的值。 – Matt

相關問題