所以,我正在尝试动态加载一个将控制器添加到主模块的文件。问题是我不想在脚本标记中引用文件本身。
更具体地说,我有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()中提到控制器名称,则会在加载之前尝试访问它,并且在加载文件之前整个事情都会崩溃
答案 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
它有一个与你非常相似的州宣言。相互比较并根据您的需要进行修改。