0

我想從updater指令動態插入<confirmation>元素到DOM中。 (我設置了一個事件,它在我的真實應用程序中執行)我只需要插入該元素,然後它將具有相同的功能(如其各自的指令中所定義)。從其他指令的編譯函數插入指令

一些背景:我嘗試追加元素,然後使用$ compile服務 - $compile(element)(scope),但我認爲$編譯內部指令的編譯功能不起作用。並且在沒有$ compile的情況下追加它不會給出任何角度綁定。

下面是一個更新 Plnkr:http://plnkr.co/edit/OyBTYGTkMtxryFdDRwQN?p=preview

反正我能做到這一點?任何幫助,即使它將我指向正確的位置,我都會深表感激。

+1

你的plunkr壞了(所以很明顯不能證明問題)。除此之外,一切都應該正常工作。你不是從一個指令的編譯函數編譯'',而是從postLink函數btw中編譯。 – gkalpak

+0

Hello ExpertSystem,對不起,我已經更新了plnkr鏈接,它的工作原理。你能看看代碼並幫助我解決問題嗎?謝謝 – SinSync

+0

仍然破碎!剩餘嘗試次數:1 – gkalpak

回答

1

你並不需要使用指令定義對象compile財產在appender指令。您只需要$compile服務即可編譯新的<confirmation>元素。
此外,您可能要指定隔離範圍(即message和/或state)的性質:

.directive('appender', function ($compile) { 
    return { 
     restrict: 'A', 
     link: function postLink(scope, elem, attrs) { 
      elem.after($compile('<confirmation message="..."></confirmation>')(scope)); 
     } 
    }; 
}); 

還參見本short demo


UPDATE:

根據您的意見,很明顯你不明白編譯和鏈接的概念。雖然,您認爲您使用的是compile屬性,但實際上您只需要鏈接功能。我強烈建議你仔細看看關於指令定義對象的the docs

return { 
    restrict: 'A', 
    link: function postLink(scope, element, attrs) { 
     scope.$watch('items', function(val, oldVal) { 
      if (val === oldVal) { return; } 
      element.after($compile('<confirmation message="..."></confirmation>')(scope)); 
     }, true); 
    } 
}; 

還參見本等short demo


更新2:

既然你是從其他指令的compile函數編譯這樣堅持,
這裏是代碼:

return { 
    restrict: 'A', 
    compile: function() { 
     var compiled = $compile('<confirmation message="..."></confirmation>'); 
     return function postLink(scope, elem, attrs) { 
      scope.$watch('items', function(val, oldVal) { 
       if (val === oldVal) { return; } 
       elem.after(compiled(scope)); 
      }, true); 
     }; 
    } 
}; 

這裏是demo

+0

我需要它從指令中的編譯函數觸發,因爲它有一個'$ watch'er,它偵聽值的變化,然後插入這個指令。這就是我一直面臨的問題,試圖在編譯函數中運行$ compile似乎不起作用。我需要訪問$範圍和範圍。 – SinSync

+1

從'compile'函數編譯''compile'沒有意義,因爲你不能鏈接(沒有連接所需的範圍)。你確定你明白'compile'和'linking'階段在指令生命週期中嗎? – gkalpak

+0

是的,我明白,但我很努力得到這個工作tbh後,我很迷茫。我該如何去從'compile'函數本身綁定它,它會在那裏監視條件,然後纔會採取行動。真的很感謝你的投入。 – SinSync