AngularJS动态加载控制器

AngularJS动态加载控制器,angularjs,angularjs-routing,Angularjs,Angularjs Routing,我读了很多关于lazzy加载的文章,但在使用$routeProvider时遇到了一个问题 我的目标是加载一个包含控制器的javascript文件,并向该控制器添加一条以前加载的路由 要加载的我的javascript文件的内容 angular.module('demoApp.modules').controller('MouseTestCtrlA', ['$scope', function ($scope) { console.log("MouseTestCtrlA"); $sco

我读了很多关于lazzy加载的文章,但在使用$routeProvider时遇到了一个问题

我的目标是加载一个包含控制器的javascript文件,并向该控制器添加一条以前加载的路由

要加载的我的javascript文件的内容

angular.module('demoApp.modules').controller('MouseTestCtrlA', ['$scope', function ($scope) {
    console.log("MouseTestCtrlA");
    $scope.name = "MouseTestCtrlA";
}]);
调用angular bootstap时不包括此文件。这意味着,我必须加载文件并创建到该控制器的路由

首先,我开始编写一个解析函数,该函数必须加载Javascript文件。但在路由声明中声明控制器参数时出错:

“MouseTestCtrlA”不是函数,未定义

以下是我正在尝试设置的呼叫:

demoApp.routeProvider.when(module.action, {templateUrl: module.template, controller: module.controller, resolve : {deps: function() /*load JS file*/} });
据我所知,控制器参数应该是一个注册的控制器

控制器–{(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'解析为注册控制器

有人能在这一点上帮助我吗?

重读这篇文章建议在Angular应用程序中保留一个
$contentProvider
实例

我在app.js中找到了这段代码

demoApp.config(function ($controllerProvider) {
     demoApp.controller = $controllerProvider.register;
});
它使我能够按照预期在外部javascript文件中编写控制器:

angular.module("demoApp").controller('MouseTestCtrlA', fn);

希望这能有所帮助!

非常感谢,我已经搜索了一段时间。希望angular的功能版本能够找到一种方法来公开注册功能,以便可以动态加载控制器。我建议您使用angular沙发土豆。它懒洋洋地注册控制器/工厂/服务等。这是我用它编写的公共应用程序(需要+Angular+UIRouter)打开。@t00f您能调用Angular.module(“demoApp”).controller('MouseTestCtrlA',fn);这是从代码中的任何地方注册新控制器吗?我有一个指令,它调用远程服务器来检索带有函数的javascript文件,因此我对它进行评估以创建动态控制器,但控制器似乎从未注册过