详解基于angular路由的requireJs按需加载js
最近终于不忙了!!有时间沉淀一下之前学到的angular东东!!
angular路由想必大家已经不陌生了!(陌生的去看我之前那篇手把手教你配置angular路由!)
angular路由作为单页面应用,切换页面的时候都是一个页面,所以切换controller和按需加载控件js就成了大问题!!折腾了我半天啊,angular-route内置的办法也没有解决这个问题,最终我是用requireJs解决的这个问题!!上代码!
1.首先引入requireJs,并且在它的下面用闭包写配置requirejs(['framework']),这句话的意思是首次进入页面,加载framework
<scriptsrc="js/lib/require.min.js"></script>
<script>
(function(){
varjsDir='/js/';
varjsLibDir='/js/lib/';
varjsComponentDir='/components/';
varpaths={
angular:jsLibDir+'angular.min',
angularRoute:jsLibDir+'angular-route.min',
jquery:jsLibDir+'jquery.min',
jQueryMD5:jsLibDir+'jquery.md5',
highcharts:jsLibDir+'highcharts',
radialProgress:jsLibDir+'radialProgress',
d3:jsLibDir+'d3.min',
echarts:jsLibDir+'echarts',
framework:jsDir+'framework',
angularUtil:jsDir+'angular-util',
standardDashboard:jsDir+'standard-dashboard',
standardConsole:jsDir+'standard-console',
standardAmountStatistic:jsDir+'standard-amount-statistic',
standardReport:jsDir+'standard-report',
standardAdvancedReport:jsDir+'standard-advanced-report',
standardExpertAnswer:jsDir+'standard-expert-answer',
standardService:jsDir+'standard-service',
standardStrategyInform:jsDir+'standard-strategy-inform',
standardMember:jsDir+'standard-member',
standardSchedule:jsDir+'standard-schedule',
standardChannel:jsDir+'standard-channel',
standardStrategyMerge:jsDir+'standard-strategy-merge',
standardIntegrate:jsDir+'standard-integrate',
standardPersonalCenter:jsDir+'standard-personal-center',
dateTimePicker:jsComponentDir+'dateTimePicker/date-time-picker',
fullCalendar:jsComponentDir+'fullCalendar/fullcalendar',
moment:jsComponentDir+'fullCalendar/moment'
};
requirejs.config({
paths:paths,
shim:{
angular:{
exports:'angular',
deps:['jquery']
},
angularRoute:{
deps:['angular']
},
jQueryMD5:{
deps:['jquery']
}
},
//urlArgs:"timeStamp="+(newDate()).getTime()
//urlArgs:'v=1.47.1&t=20160719'
});
requirejs(['framework']);
}());
</script>
2.framework.js作为首次加载的js,起到至关重要的作用哈!!定义frameworkApp模块作为主模块,另外加载公共服务utilmodel和ngRoute路由,定义一个resolveController方法,回调函数是requireJs,一会儿会讲到!
//引入模块
varframeworkApp=angular.module('FrameworkApp',['ngRoute','utilModule']);
//加载对应的controller
varresolveController=function(names,dependancies){
//console.log(names)
//console.log(dependancies)
return{
loadController:['$q','$rootScope',function($q,$rootScope){
vardefer=$q.defer();
require(names,function(){
defer.resolve();
$rootScope.$apply();
});
returndefer.promise;
}]
};
};
3.配置路由,用resolve方法完成回调,注意回调的是一个list,值是步骤一中定义的模块名称
frameworkApp.config(['$routeProvider','$controllerProvider','$provide','$compileProvider','$filterProvider',
function($routeProvider,$controllerProvider,$provide,$compileProvider,$filterProvider){
frameworkApp.register={
controller:$controllerProvider.register,
factory:$provide.factory,
service:$provide.service,
filter:$filterProvider.register,
directive:$compileProvider.directive
};
$routeProvider
.when('/',{
redirectTo:'/dashboard'
})
.when('/dashboard',{
templateUrl:'dashboard.html',
controller:'DashboardCtrl',
resolve:resolveController(['standardDashboard','d3','radialProgress','highcharts'])
})
.when('/console',{
templateUrl:'console.html',
controller:'ConsoleCtrl',
resolve:resolveController(['standardConsole'])
})
.when('/amountStatistic',{
templateUrl:'amount-statistic.html',
controller:'amountStatisticCtrl',
resolve:resolveController(['standardAmountStatistic','highcharts','dateTimePicker'])
})
.when('/report',{
templateUrl:'report.html',
controller:'ReportCtrl',
resolve:resolveController(['standardReport','dateTimePicker'])
})
.when('/advancedReport',{
templateUrl:'advanced-report.html',
controller:'advancedReportCtrl',
resolve:resolveController(['standardAdvancedReport','highcharts','dateTimePicker'])
})
.when('/expertAnswer',{
templateUrl:'expert-answer.html',
controller:'expertAnswerCtrl',
resolve:resolveController(['standardExpertAnswer'])
})
.when('/service',{
templateUrl:'service.html',
controller:'ServiceCtrl',
resolve:resolveController(['standardService'])
})
.when('/strategy-inform',{
templateUrl:'strategy-inform.html',
controller:'StrategyInformCtrl',
resolve:resolveController(['standardStrategyInform'])
})
.when('/member',{
templateUrl:'member.html',
controller:'MemberCtrl',
resolve:resolveController(['standardMember'])
})
.when('/schedule',{
templateUrl:'schedule.html',
controller:'ScheduleCtrl',
resolve:resolveController(['standardSchedule'])
})
.when('/channel',{
templateUrl:'channel.html',
controller:'ChannelCtrl',
resolve:resolveController(['standardChannel'])
})
.when('/strategy-merge',{
templateUrl:'strategy-merge.html',
controller:'StrategyMergeCtrl',
resolve:resolveController(['standardStrategyMerge'])
})
.when('/integrate',{
templateUrl:'integrate.html',
controller:'IntegrateCtrl',
resolve:resolveController(['standardIntegrate'])
})
.when('/personalCenter',{
templateUrl:'personal-center.html',
controller:'PersonalCenterCtrl',
resolve:resolveController(['standardPersonalCenter'])
})
.otherwise({
redirectTo:'/error'
});
}]);
4.大功告成啦~完成controller切换,和js按需加载!!!啦啦啦!
5.有一点我也没解决,在引入echarts的时候,用这种方法就报错了,换成highcharts就可以了,折腾半天啊也没把echarts引进来,不过到是发现,在require生效之前引入echarts的话,是可以的!求大神讲解啊!!
<!--startbuild--> <scriptsrc="js/lib/echarts.js"></script> <scriptsrc="js/lib/require.min.js"></script>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。