JavaScript

超轻量级php框架startmvc

详解基于angular路由的requireJs按需加载js

更新时间:2020-04-21 00:04:33 作者:startmvc
最近终于不忙了!!有时间沉淀一下之前学到的angular东东!!angular路由想必大家已经不陌

最近终于不忙了!!有时间沉淀一下之前学到的angular东东!!

angular路由想必大家已经不陌生了!(陌生的去看我之前那篇手把手教你配置angular路由!)

angular路由作为单页面应用,切换页面的时候都是一个页面,所以切换controller和按需加载控件js就成了大问题!!折腾了我半天啊,angular-route内置的办法也没有解决这个问题,最终我是用requireJs解决的这个问题!!上代码!

1.首先引入requireJs,并且在它的下面用闭包写配置 requirejs(['framework']),这句话的意思是首次进入页面,加载framework


<script src="js/lib/require.min.js"></script> 
<script> 
 (function () { 
 var jsDir = '/js/'; 
 var jsLibDir = '/js/lib/'; 
 var jsComponentDir = '/components/'; 
 var paths = { 
 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=" + (new Date()).getTime() 
 //urlArgs: 'v=1.47.1&t=20160719' 
 }); 
 requirejs(['framework']); 
 }()); 
</script> 

2.framework.js作为首次加载的js,起到至关重要的作用哈!!定义frameworkApp模块作为主模块,另外加载公共服务utilmodel和ngRoute路由,定义一个resolveController方法,回调函数是requireJs,一会儿会讲到!


//引入模块 
var frameworkApp = angular.module('FrameworkApp',['ngRoute', 'utilModule']); 
//加载对应的controller 
var resolveController = function (names, dependancies) { 
 //console.log(names) 
 //console.log(dependancies) 
 return { 
 loadController: ['$q', '$rootScope', function ($q, $rootScope) { 
 var defer = $q.defer(); 
 require(names, function () { 
 defer.resolve(); 
 $rootScope.$apply(); 
 }); 
 return defer.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的话,是可以的!求大神讲解啊!!


<!-- start build --> 
 <script src="js/lib/echarts.js"></script> 
 <script src="js/lib/require.min.js"></script> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

angular路由js加载 requirejs 动态加载js angularjs 路由加载js