2014-11-08 72 views
0

我正在開發angularjs應用程序,應該可以使用「addins」進行擴展。在簡化的情況下,插件只是一對js + html文件。每個插件應該有一個或多個控制器和一個或多個工廠。 下面是與一個控制器和一個工廠加入的示例:在angularjs中動態加載控制器+工廠

JS:

angular.module('addins.basic', []) 

angular.module('addins.basic').factory('BasicAddinFactory', [BasicAddinFactory]); 

function BasicAddinFactory() 
{ 
    var fact = 
    { 
     Invoke: function() 
     { 
      console.log('BasicAddinFactory.Invoke'); 
     }, 
     GetClients: function() 
     { 
      return ["aa", "bb"]; 
     } 
    } 

    return fact; 
} 

angular.module('addins.basic').controller('BasicAddinController', ['$scope', 'BasicAddinFactory', BasicAddinController]); 

function BasicAddinController($scope, $injector, addin) 
{ 
    //var injector = angular.injector(['ng', 'addins.basic']) 
    //var addin = injector.get('BasicAddinFactory'); 

    $scope.expr = 'BasicAddinFactory: ' + addin.GetClients()[0]; 
} 

HTML:

<div ng-controller="BasicAddinController"> 
    <input type="text" ng-model="expr"> 
    <span>{{ expr }}</span> 
</div> 

加載的加載項動態未使用的技術的問題廣泛在互聯網上描述的:通過向DOM添加JS腳本和HTML。一切都加載好,直到我嘗試注入BasicAddinFactory對BasicAddinController的依賴。這樣做後,我在動態加載過程中出現錯誤:未知提供者:addinProvider < - addin。

有趣的部分是,如果我沒有明確注入依賴項,那麼一切都會正常加載,我甚至可以通過使用上面示例中的註釋代碼從控制器(或從加載「插件」的父代碼)訪問工廠實例。但這很難看,我不想這樣。

如果有人能指出我的錯誤在哪裏,我將不勝感激。

謝謝。

UPDATE:Sample plunk

回答

2

這與角如何實際處理幕後的依賴關係的事情。 bootstrap過程處理註冊您的所有各種服務。

當您動態添加模塊時,您需要自己註冊這些新模塊。其中一個辦法是有像這樣每種類型的服務的一個全局寄存器功能:

app.config(['$controllerProvider', 
    '$compileProvider', '$filterProvider', '$provide', 
    function($controllerProvider, 
    $compileProvider, $filterProvider, $provide) { 

    app.register = { 
     controller: $controllerProvider.register, 
     directive: $compileProvider.directive, 
     filter: $filterProvider.register, 
     factory: $provide.factory, 
     service: $provide.service 
    }; 
    } 
]); 

然後你改變你的動態模塊,像這樣登記自己的服務:

app.register.factory('BasicAddinFactory', [BasicAddinFactory]); 

A Plunker example.

+0

謝謝回覆。不幸的是,事實並非如此。添加控制器中未使用的服務不會改變任何內容。如果它們被正確注入 - 它們不會破壞它的「編譯」。 – Amid 2014-11-09 07:46:01

+0

這並不是說它們沒有被使用,而是依賴數組的順序很重要。一個例子:http://jsfiddle.net/TwoToneBytes/022mnqzp/3/ – 2014-11-09 07:57:10

+0

對不起。當我準備stackowerflow的代碼時,這只是一個錯字。下面是一個說明問題的概念:[sample](http://plnkr.co/edit/vys1yhNQYA8ejZMSXSS9?p=preview)。嘗試刪除那裏注射到工廠,它工作正常。 – Amid 2014-11-09 08:30:27