2015-06-02 32 views
2

有沒有一種方法可以通過使用decorator模式代理它來動態地(角引導之後)以增強服務。如何在angularjs引導後動態添加修飾器

在以下plunker example我可以使用應用程序的app.requires依賴性過載的默認搜索服務(谷歌基於),但是這依賴於聲明/加成超載模塊(雅虎之一)的角度的應用程序被自舉前。一旦角度應用程序已經被引導,這一點不起作用,如點擊duckduckgo按鈕演示。

我必須通過在應用程序中將web代碼嵌入到java客戶端(使用JavaFX webview)和其中某些動作(動態引入的動作)需要替換的遷移場景中webapp的標準行爲。

我試圖使用Ifeanyi Isitor in his blog描述的一些技術沒有成功。

回答

0

一種可能的方法可能是保留當前運行的應用程序的injector(如angular.injector文檔底部所述)。這是通過在當前正在運行的應用程序的元素上使用angular.element來獲得其injector()來完成的。

輕鬆獲得該元素的保留,如果你給上你聲明你的應用程序的mcfoggy-application-search的ID標籤:

<div ng-app="mcfoggy.application.search" id="mcfoggy-application-search">...</div> 

...你可以.getElementById()和揍原(按照你的plunkr):

console.info('interpreting duckduckGoService.js'); 

var appElement = document.getElementById('mcfoggy-application-search'); 
var injector = angular.element(appElement).injector(); 

injector.invoke(['SearchService', '$log', function(SearchService, $log) { 
     // replace search in SearchService 
     SearchService.search = function(terms) { 
      var duckduckGoSearch = 'https://duckduckgo.com/?q=' + encodeURI(terms); 
      $log.info("search called: " + duckduckGoSearch); 
      // $window.location.href = duckduckGoSearch; 
     }; 
}]); 

也許不如裝飾漂亮,但它似乎工作!

Updated plnkr

+0

沒有任何其他的答案,我會給予你的賞金,但不會接受的答案,因爲它不使用裝飾。感謝您的時間和幫助。 –

+0

謝謝,@MatthieuBROUILLARD--希望至少有一些幫助。我有興趣進一步調查這種方法與裝飾的可能性的比較(當我有更多時間時,我會嘗試這樣做);當你應用到你的簡化的實際代碼時,你是否能夠擴展你在上述方法中遇到的限制?樂於集思廣益進一步的解決方案。 – JcT