您的位置:首页 > Web前端 > AngularJS

angularjs+requirejs按需加载

2015-12-17 10:11 621 查看
很久没上过csdn了,久到忘记了密码。事情多了,记性也不好,上来更新一下最近自己遇到的问题,也算是写个备忘录。

问题

是这样的,angularjs是预加载方式。一个应用模块不多的时候到无所谓。但是一个大型应用预加载还是很难让人接受的。网上看到一些解决方案,用ocLazyLoad的挺多,我试着用了一次,个人感觉配置麻烦。于是就有了下面的解决方案:我用的是angularjs + requirejs

解决方案

define(['app','navData'], function (app) {
app.config(function($stateProvider, $urlRouterProvider, $controllerProvider, navData){
app.registerController = $controllerProvider.register;
app.loadJs = function(js){
return function($rootScope, $q){
var def = $q.defer(), deps=[];

angular.isArray(js) ? (deps = js) : deps.push(js);
require(deps,function(){
$rootScope.$apply(function(){
def.resolve();
});
});
return def.promise;
};
}

$urlRouterProvider.otherwise('/memory');
angular.forEach(navData, function(it){
var st = it.state.split(/\./gi),
ctrlPath = 'controllers/' + st[0],
ctrlName = 'ctrl.' + st[0]
;
$stateProvider.state(st[0],{
url : '/' + st[0],
templateUrl : 'tpls/' + st[0] + '.html',
controller : ctrlName,
resolve:{
deps:app.loadJs(ctrlPath)
}
});
})
});
});


关键

这句是将controller的注册引用到registerController上

app.registerController = $controllerProvider.register;


下面是state赋值时需要注意到的,loadJs实现上面有,就是异步加载需要的模块(不重要的内容用 … 省略)

...
resolve:{
deps:app.loadJs(ctrlPath)
}
...


然后注册controller的时候这样做(这里是loadJs需要异步加载的模块)

define(['app'],function(app){
app.registerController('ctrl.memory',function(){});
});


Demo

下面是我写的Demo,有不懂的可以下载来看看。

https://github.com/zhoulijie/angularjs-controller-load-on-demand
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: