关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
ui-router是angular.js的路由管理库,可以通过ui-router实现页面局部刷新,同时导航栏的地址也随之变化。它类似pjax的效果。
但有个问题,ui-router局部刷新加载的页面不能加载其中的script标签,即无法执行其js代码。
我们可以使用ocLazyLoad实现加载局部页面同时,也加载对应所需的js或css文件。
首先打开ocLazyLoad的Github项目地址,下载到本地。取其中dist文件夹的内容,我们要引用ocLazyLoad.min.js文件。具体ocLazyLoad你也可查看ocLazyLoad的帮助文档。
接着,引用了angular.js和ui-router相关文件。大致如下:
<script src="angular/1.4.8/angular/angular.min.js"></script> <script src="angular/ui-router/release/angular-ui-router.min.js"></script> <script src="angular/oclazyload/src/ocLazyLoad.min.js"></script>
使用ocLazyLoad需要在angular的module注册(注意顺序):
angular.module('myApp', [ 'ui.router', 'oc.lazyLoad', ]);
在ui-router的resolve中使用ocLazyLoad:
angular.module('myApp').config(routesConfig); function routesConfig($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/'); $stateProvider // home states and nested views .state('page1', { url: '/', templateUrl: '/page1', resolve:{ deps:["$ocLazyLoad", function($ocLazyLoad){ return $ocLazyLoad.load([ "lib/other.js", "lib/other.css" ]); }] } }); };
大致格式是这样,不过这个是简单玩法。假如通过ocLazyLoad加载的js文件也需要在angular.js的module注册,可以通过$ocLazyLoad的inject方法注入。如下代码:
angular.module('myApp').config(routesConfig); function routesConfig($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/'); $stateProvider .state('page1', { url: '/page1', templateUrl: '/page1', resolve:{ deps:["$ocLazyLoad", function($ocLazyLoad){ $ocLazyLoad.inject(['pdf']); return $ocLazyLoad.load([ "lib/pdfjs/pdf.js", "lib/angular-pdf.min.js", ]); }] } }); };
但还是不够完美。假如page2也需要用到pdf.js,再写一遍同样的代码?
不需要!可以换种方式,将重用率比较高的js库写成模板,再被$ocLazyLoad.Load()。
如下代码:
angular.module('myApp').config(oclazyloadConfig); function oclazyloadConfig($ocLazyLoadProvider){ $ocLazyLoadProvider.config({ modules: [{ name: 'pdf_module', //pdf loadedModules: ['pdf'], //注册pdf模块 files: [ "lib/pdfjs/pdf.js", "lib/angular-pdf.min.js", ] },{ name: 'video_module', //video 视频播放 loadedModules: ['vjs.video'], files: [ "lib/videojs/vjs-video.min.js", "lib/videojs/video.min.js", "lib/videojs/videojs-ie8.min.js", "lib/video-js.min.css", ] } }); }
执行如上代码之后,在执行ui-router的代码,如下:
angular.module('myApp').config(routesConfig); function routesConfig($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/'); $stateProvider .state('page1', { url: '/page1', templateUrl: '/page1', resolve:{ deps:["$ocLazyLoad", function($ocLazyLoad){ $ocLazyLoad.inject(['pdf']); return $ocLazyLoad.load([ "pdf_module" ]); }] } }) .state('page2', { url: '/page2', templateUrl: '/page2', resolve:{ deps:["$ocLazyLoad", function($ocLazyLoad){ $ocLazyLoad.inject(['pdf']); return $ocLazyLoad.load([ "pdf_module", "video_module" ]); }] } }); };
搞定!ocLazyLoad还有更多玩法,不过官方的帮助文档不全面。还有一些网友,进一步对ocLazyLoad封装。使其直接可以加载ui-router的templateUrl中的html页面的script标签。有兴趣可以在github上面找找。