Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 703|回复: 0

AngularJs根据访问的页面动态加载Controller的解决方案

[复制链接]
  • TA的每日心情
    奋斗
    2024-11-24 15:47
  • 签到天数: 804 天

    [LV.10]以坛为家III

    2053

    主题

    2111

    帖子

    72万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    726782
    发表于 2021-4-17 14:44:13 | 显示全部楼层 |阅读模式

    最近AngularJs很火....

    废话不多说了,如主题吧

    用Ng就是想做单页面应用(simple page application),就是希望站内所有的页面都是用Ng的Route,尽量不用location.href,但是这样的webapp好处是很多,但是美中不足的是当你的webapp随着时间的推移,用户变多,功能变得更丰富,controller也变得越来越多,你不得不把所有的controller当作全局模块进行加载,以使得在站内任何一个页面中按F5刷新后能route到任意一个其他页面,而不会发生找不到controller的错误,加载所有的controller使得在手机端上,页面的首次打开速度变慢,今天我就和大家分享我是怎么改善这个缺点的,实现Controller的模块化加载

    app.js

    app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {
      app.register = {
        controller: $controllerProvider.register,
        directive: $compileProvider.directive,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
      };
    });

    在route时阻塞一下去加载需要的js,加载成功后再继续,不知道$script是什么的同学请点http://dustindiaz.com/scriptjs

    $routeProvider.when('/:plugin', {
    
      templateUrl: function(rd) {
        return 'plugin/' + rd.plugin + '/index.html';
      },
    
      resolve: {
        load: function($q, $route, $rootScope) {
    
          var deferred = $q.defer();
    
          var dependencies = [
            'plugin/' + $route.current.params.plugin + '/controller.js'
          ];
    
          $script(dependencies, function () {
            $rootScope.$apply(function() {
              deferred.resolve();
            });
          });
    
          return deferred.promise;
        }
      }
    });

    controller.js

    app.register.controller('MyPluginCtrl', function ($scope) {
      ...
    });

     index.html

    <div ng-controller="MyPluginCtrl">
      ...
    </div>

    这样改造就可以实现route时动态去加载这个route所依赖的js,但是一般我们的webapp中route都有很多,每个都要写那么一堆代码,既难看又难于维护,我们不妨再优化一下

    app.js

    app.config(function($controllerProvider, $compileProvider, $filterProvider, $provide) {
      app.register = {
        controller: $controllerProvider.register,
        directive: $compileProvider.directive,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
      };
      app.asyncjs = function (js) {
            return ["$q", "$route", "$rootScope", function ($q, $route, $rootScope) {
                var deferred = $q.defer();
                var dependencies = angular.copy(js);
                if (Array.isArray(dependencies)) {
                    for (var i = 0; i < dependencies.length; i++) {
                        dependencies += "?v=" + v;
                    }
                } else {
                    dependencies += "?v=" + v;//v是版本号
                }
                $script(dependencies, function () {
                    $rootScope.$apply(function () {
                        deferred.resolve();
                    });
                });
                return deferred.promise;
            }];
        }
    });
    $routeProvider.when('/:plugin', {
    
      templateUrl: function(rd) {
        return 'plugin/' + rd.plugin + '/index.html';
      },
    
      resolve: {
        load: app.asyncjs('plugin/controller.js')
      }
    });

    到此只要把原来一个controller.js按模块拆分成多个js然后为route添加模块依赖便可提高加载速度,这个方法不仅仅可以用在controller按需加载,而且可以用在其他js模块,例如jquery.ui.datepicker.js这样的日期选择插件,在需要日期选择插件的route节点加上

    $routeProvider.when('/:plugin', {
    
      templateUrl: function(rd) {
        return 'plugin/' + rd.plugin + '/index.html';
      },
    
      resolve: {
        load: app.asyncjs(['plugin/controller.js','plugin/jquery.ui.datepicker.js'])
      }
    });

    便可以了

    PS:$script可以对需要加载的js进行判断,如果之前已经加载过了他会直接返回成功,也就是说只有在第一次进入日期选择界面时会去请求jquery.ui.datepicker.js退出去再进就不会去请求啦

    感谢原问题回答者:http://stackoverflow.com/questions/20909525/load-controller-dynamically-based-on-route-group

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-1-24 14:58 , Processed in 0.062090 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表