2014-06-29 118 views
1

背景:如何在現有父指令元素和子指令元素之間動態嵌套指令元素?

我正在使用自定義的CMS,我對代碼庫的訪問權限有限。所以,在少數情況下,我打算使用JavaScript進行一些DOM操作。

問題:

我有一個容器指令和容器具有普通的老HTML項目,但我不能夠標記的項目爲從服務器端的指令。此外,普通的舊HTML項目包含指令的子內容。

例子:

這裏是前:

DIV[container-directive] 

    DIV.some-item-in-html 
    DIV[some-directive-in-the-content] 


    DIV.some-item-in-html 
    DIV[some-directive-in-the-content] 

    ... 

這裏是DOM應該是什麼樣子算賬:

DIV[container-directive] 

    DIV[container-item]  <-- This is what needs to be inserted 

    DIV.some-item-in-html 
     DIV[some-directive-in-the-content] 

    DIV[container-item]  <-- This is what needs to be inserted 

    DIV.some-item-in-html 
     DIV[some-directive-in-the-content] 

    ... 

問:

有沒有人有使用JavaScript在嵌套指令之間注入DOM指令的最佳方法的建議?

的幾點思考:

我認爲操作DOM通過提前角彙編的,但我不知道是否有一種方式來角的框架內做到這一點。

另一個選擇是來自容器指令的後鏈接功能,我可以將HTML項目包裝在名爲「container-item」的指令元素中,然後$手動編譯項目。所以,我試過這個,但是我得到一個錯誤,這些錯誤與已經包含指令的內容中的內容有關。關於「ngTransclude」的一些事情是意料之外的。我認爲這與已經處理的內部指令有關。

+0

建議你創建一個複製的問題,您是否嘗試過 – charlietfl

+0

的代碼,我知道你在問什麼,但我不是真的想修復損壞的代碼演示。有幾種方法可以解決上述問題。如果是這樣,那麼我的代碼可能無關緊要,如果有效的解決方案是非常不同。另一方面,如果只有一種方法可以完成上述問題,那麼我的代碼無關緊要,因爲答案在答案中可能會編寫一個單獨的代碼結構(可能會用相對較少的代碼)或者在這個問題上有知識的人可以提出最好的方法,而無需編寫代碼,這將是一個有效的答案。 –

+0

該方法不適合這個網站,你提到你嘗試了一些沒有用的東西,所以發佈代碼。這通常是如何在這裏工作 – charlietfl

回答

3

我會去你的第一個選項,並在角度編譯之前操作DOM。

您可以在包含要操作的元素的指令中執行此操作。

例如:

app.directive('body', function() { 
    return { 
     restrict: 'E', 
     compile: function(element, attr) { 
      // find the inner element and wrap it 
      $('.some-item-in-html', element).wrap('<div class="container"></div>'); 
     } 
    } 
}); 

家長指令是孩子指令之前總是被編譯,所以你可以改變編譯屬性中的孩子們的DOM,而不必擔心重新編譯或重新鏈接指令。

[編輯]

感謝比亞焦爲以下編輯。

此方法不應與具有模板的指令一起使用,因爲該元素將分配給模板而不是子元素。

另一種選擇是在角度生命週期開始時運行的函數中執行DOM操作。

例如:

app.run(function(){ 
     // find the inner element and wrap it 
     $('.some-item-in-html').wrap('<div  class="container"></div>'); 
    }); 
+0

我沒有想過這件事。在這種情況下,我可以使用container指令中的compile屬性。我會試一試。 –

+0

是的,也應該工作。只要確保你只操作了孩子的DOM。使用'身體'作爲指示是很方便的,因爲一切都是身體的一個孩子。 – pixelbits

+1

哦,是的,容器指令使用一個模板,所以由compile屬性提供的元素是模板,而不是將被transcluded的內容。我嘗試了你的建議,並且使用父指令手動插入包裝器元素的方式就像你寫它的方式一樣。此外,只需在模塊run()函數中放置「預處理」DOM操作即可。我有點希望還有另一種更具角度的選擇,我們還沒有想過......如果這是有道理的。 –