我讀了很多關於lazzy加載,但我使用$ routeProvider時遇到問題。AngularJS動態加載控制器
我的目標是加載一個JavaScript文件,其中包含一個控制器,並添加一個路由到此控制器之前已經加載。
angular.module('demoApp.modules').controller('MouseTestCtrlA', ['$scope', function ($scope) {
console.log("MouseTestCtrlA");
$scope.name = "MouseTestCtrlA";
}]);
此文件時的角度bootstap被稱爲不包括我的javascript文件的
要加載的內容。這意味着,我必須加載文件並創建一個到這個控制器的路由。
首先,我開始編寫一個解析函數,它必須加載Javascript文件。但在宣佈在航線聲明我的控制器參數,給了我一個錯誤:
「MouseTestCtrlA」是不是一個功能,得到了不確定
這裏是調用我想設置:
demoApp.routeProvider.when(module.action, {templateUrl: module.template, controller: module.controller, resolve : {deps: function() /*load JS file*/} });
從我看到的,控制器參數應該是註冊的控制器
con troller - {(string | function()=} - 應該與新創建的作用域相關聯的控制器fn或作爲字符串傳遞的已註冊控制器的名稱。
因此,我寫了一個工廠,應該能夠加載我的文件,然後(承諾風格!)我試圖聲明一個新的路線。
它給了我類似下面,其中依賴性是JavaScript文件路徑的數組加載:
使用
ScriptLoader.load(module.dependencies).then(function() {
demoApp.routeProvider.when(module.action, {templateUrl: 'my-template', controller: module.controller});
});
腳本裝載機
angular.module('demoApp.services').factory('ScriptLoader', ['$q', '$rootScope', function ($q, $rootScope) {
return {
load: function (dependencies)
{
var deferred = $q.defer();
require(dependencies, function() {
$rootScope.$apply(function() {
deferred.resolve();
});
});
return deferred.promise;
}
}
}]);
問題
我仍然有這個JavaScript錯誤「'MouseTestCtrlA'不是一個函數,得到未定義」,這意味着Angular無法解析'MouseTestCtrlA'作爲註冊控制器。
任何人都可以幫助我在這一點上?
非常感謝,我一直在尋找這一段時間。希望功能版本的角會找到一種方法來公開註冊功能,以便控制器可以動態加載。 – ltfishie
我會建議你使用角沙發土豆。它懶惰 - 註冊控制器/工廠/服務/等。我在[github](https://github.com/castawaylabs/semaphore)上編寫的一個公共應用程序(Require + Angular + UIRouter)。 –
這段代碼保存了我的晚上:) – Yasser