微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Angular-ui-router + oclazyload + requirejs实现资源随route懒加载

<table class="text"><tr class="li1">
<td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

功能,本文就介绍利用此点实现前端资源的懒加载。   问题   目前大部分AngularJS的应用用requirJS组织模块,但是很多都没有使用lazyload功能,在app.js中启动时将全部依赖加载进来,在模块功能较少,前端资源少的情况下没问题。那么问题来了,依赖资源过多时怎么办?   build时利用grunt-contrib-requirejs提取合并文件,减少http请求,但是存在问题:build后文件大;线上调试不方便,尤其在html2js后问题更明显。 开发中尽量在原有文件里进行新业务添加,不增加额外的http请求压力,但是存在问题:多人合作时需要经常处理代码冲突;单个文件(control,directive等)很大,看的是眼花缭乱,容易出问题。 解决问题   基本思路:在路由切换时加载所需要资源。 工具:Angular-ui-router,oclazyload,requirejs。   配置oclazyload 在引入oclazyload文件后配置主要参数项     app.config([‘$ocLazyLoadProvider‘,function($ocLazyLoadProvider){         $ocLazyLoadProvider.config({             loadedModules: [‘monitorApp‘],//主模块名,和ng.bootstrap(document,[‘monitorApp‘])相同             jsLoader: requirejs,//使用requirejs去加载文件             files: [‘modules/summary‘,‘modules/appEngine‘,‘modules/alarm‘,‘modules/database‘],//主模块需要的资源,这里主要子模块的声明文件             debug: true         });    }]);     配置ui-route 利用angularjs-ui-route配置路由跳转的基本规则和需要懒加载文件     app.config([‘$stateProvider‘,‘$urlRouterProvider‘,function($stateProvider,$urlRouterProvider){         var lazyDeferred;         /**          * 路由切换时调用          * @param param.file 懒加载文件数组          * @param tpl 子模块view视图          * @param module 子模块名          */         function resovleDep(param,tpl,module){             var resolves = {                 loadMyCtrl: [‘$ocLazyLoad‘,‘$templateCache‘,‘$q‘,function($ocLazyLoad,$templateCache,$q) {                     lazyDeferred = $q.defer();                     return $ocLazyLoad.load({                         name : module,                        cache: false,                        files: param.files                     }).then(function() {                         lazyDeferred.resolve($templateCache.get(tpl));                     });                 }]             };             return resolves;         };           $urlRouterProvider.otherwise(‘/summary‘);         //路由配置         $stateProvider             .state(‘module1‘,{                 url:‘/module1‘,                templateProvider: function() { return lazyDeferred.promise; },                controller: ‘module1Controller‘,                resolve : resovleDep({files:[                     ‘controllers/module1Ctrl‘,                    ‘services/module1Service‘,                    ‘directives/module1Directive‘                 ]},‘views/module1.html‘,‘app.module1‘)             })             .state(‘module2‘,{                 abstract: true,                url: ‘/module2‘,                templateUrl: ‘views/module2.html‘             })             .state(‘module2.list‘,{                 url: ‘‘,                controller: ‘module2Controller‘,                resolve : resovleDep({files:[                     ‘controllers/module2ListCtrl‘,                    ‘services/module2Service‘                 ]},‘views/list.html‘,‘app.module1‘)             })             .state(‘module1.detail‘,{                 url: ‘/:id‘,                controller: ‘detailController‘,                resolve : resovleDep({files:[                      ‘controllers/detailCtrl‘,                     ‘services/detailService‘                 ]},‘views/detail.html‘,‘app.module2‘)             });     }]);     结束   ok,至此就可以在路由切换时方便的加载子模块和依赖资源,oclazyload和ui-router还有很多可挖掘的,大家可参考api满足需求。 ps:最初用angular-route+oclazyload做时出现:   multiple directives asking for isolated scope on multiple asking for template 等问题,不好用,建议使用ui-route,强大的多。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐