使用状态提供程序从单独文件延迟加载控制器

时间:2017-01-19 21:04:51

标签: javascript angularjs oclazyload

所以,我正在尝试动态加载一个将控制器添加到主模块的文件。问题是我不想在脚本标记中引用文件本身。

更具体地说,我有2个控制器文件。我的mainController.js文件中引用的主控制器文件index.html。我添加到该文件的任何控制器都会加载而没有问题。

我想用于登录页面login.js的控制器文件包含以下信息:

function LoginCtrl($http){
  console.log("Controller loaded");  
};

angular
    .module('inspinia')
    .controller('LoginCtrl', LoginCtrl);

我的所有控制器文件都位于同一文件夹中,但与mainController.js相反,login.js文件未显示在任何.html文件中。

我的目的是在stateProvider内动态加载login.js文件,如下所示:

$stateProvider
...
.state('logins', {
            url: "/logins",
            templateUrl: "views/login.html",
            controller: LoginCtrl,
            data: { pageTitle: 'Login', specialClass: 'gray-bg' },
            resolve: {

                loadPlugin: function($ocLazyLoad) {
                    return $ocLazyLoad.load ({
                    name: 'inspinia.LoginCtrl',
                      files: ['js/controllers/login.js']
                    });
                }
            }
        })
...

只要我不尝试动态加载login.js文件(因此在.html文件中添加对文件的引用或在mainController.js文件中添加登录控制器代码)一切正常。但是一旦我尝试删除引用以强制stateProvider处理加载,我得到Error: $injector:modulerr

任何人都知道调用lazyLoader的正确方法是什么,所以我只能在需要时加载我的.js文件?

编辑信息: 我忘了提到的东西:文件加载部分本身似乎正在工作。如果我不在任何地方调用控制器而只加载它。我可以看到浏览器正在加载控制器文件。但问题似乎是一个时间问题。如果我在.state()中提到控制器名称,则会在加载之前尝试访问它,并且在加载文件之前整个事情都会崩溃

1 个答案:

答案 0 :(得分:0)

我建议你查看ocLazyLoad以查看如何使用ui-router resolve state属性声明和加载控制器:

https://oclazyload.readme.io/docs/with-your-router

基本上,我认为你的方法中缺少的是使用字符串控制器声明,而不是函数1:

$stateProvider
...
.state('logins', {
        url: '/logins',
        templateUrl: 'views/login.html',
        controller: 'LoginCtrl as login',
        data: {
            pageTitle: 'Login',
            specialClass: 'gray-bg'
        },
        resolve: {
            loadPlugin: function($ocLazyLoad) {
                return $ocLazyLoad.load('js/controllers/login.js');
            }
        }
    })
...

使用重要提示是:简化先前未使用过的内容的首次实现。您的示例在ocLazyLoad服务上显示了许多参数。尝试首先加载你需要的主要元素,在成功之后逐步添加一个,因为有时候,你可能在正确的轨道上,你不知道的这样的东西,可以引导你进行一个loooooong调试例程。

另外,请看下面的示例:

https://github.com/ocombe/ocLazyLoad/tree/master/examples/complexExample

它有一个与你非常相似的州宣言。相互比较并根据您的需要进行修改。