AngularJS如何实现动态加载Controller

本篇文章给大家分享的内容是AngularJS如何实现动态加载Controller,有着一定的参考价值,有需要的朋友可以参考一下

我们把实现动态加载Controller方法封装到一个通用的模块里面,并命名这个模块为ngCommon。

(function (angular) {'use strict';    var CommonApp = angular.module('ngCommon');    ...    })(angular);

登录后复制

接下来我们实现一个动态加载js的方法$require。

/* 记录已加载的js */var loaded = {};/* 检测是否加载 */var checkLoaded = function (url) {    return !url || !angular.isString(url) || loaded[url];};        CommonApp.factory('$require', ['$document', '$q', '$rootScope', function ($document, $q, $rootScope) {    return function (url) {        var script = null;        var onload = null;        var doc = $document[0];        var body = doc.body;        var deferred = $q.defer();        if (checkLoaded(url)) {            deferred.resolve();        } else {            script = doc.createElement('script');            onload = function (info) {                if (info === 1) {                    deferred.reject();                } else {                    loaded[url] = 1;                    /* AngularJS 

然后重点来了,通过$routeProvider route的resolve功能来实现动态加载Controller。

CommonApp.provider('$routeResolver', function () {    this.$get = function () {        return this;    };    this.route = function (routeCnf) {        var controller = routeCnf.controller;        var controllerUrl = routeCnf.controllerUrl;        if (controllerUrl) {            routeCnf.reloadOnSearch = routeCnf.reloadOnSearch || false;            routeCnf.resolve = {                load: ['$route', '$require', 'ControllerChecker',                    function ($route, $require, ControllerChecker) {                        var controllerName = angular.isFunction(controller) ? controller($route.current.params) : controller;                        var url = angular.isFunction(controllerUrl) ? controllerUrl($route.current.params) : controllerUrl;                        if (checkLoaded(url) || (controllerName && ControllerChecker.exists(controllerName))) {                            loaded[url] = true;                            return;                        }                        return $require(url);                }]            };        }        return routeCnf;    };})

登录后复制

看上面的代码中还注入了一个叫ControllerChecker的,这个是用来检测当前Controller是否已经注册了,如果未注册,那么我们就加载相关js注册新的Controller。代码如下:

CommonApp.service('ControllerChecker', ['$controller', function ($controller) {    return {        exists: function (controllerName) {            if (angular.isFunction(window[controllerName])) {                return true;            }            try {                $controller(controllerName, {}, true);                return true;            } catch (e) {                return false;            }        }    };}]);

登录后复制

最后我们来添加一个注动态册的方法。

CommonApp.setupRegister = function (module) {    module.config([        '$controllerProvider',        '$compileProvider',        '$filterProvider',        '$provide',        function ($controllerProvider, $compileProvider, $filterProvider, $provide) {            module.register = {                controller: $controllerProvider.register,                directive: $compileProvider.directive,                filter: $filterProvider.register,                factory: $provide.factory,                service: $provide.service,                value: $provide.value,                constant: $provide.constant            };        }    ]);};

登录后复制

到此已经基本完成了,如何使用呢?

var DemoApp = angular.module('DemoApp',['ngRoute','ngCommon']);/* 调用动态注册方法,为当前模块添加动态注册方法 */angular.module('ngCommon').setupRegister(DemoApp);DemoApp.config(['$routeProvider', '$routeResolverProvider', function ($routeProvider, $routeResolverProvider) {    var route = $routeResolverProvider.route;    $routeProvider.when('/index', route({        templateUrl: './view/index.html'),        controller: 'IndexController', /* 在此申明了controller就不需要再html里面申明ng-controller了 */        controllerUrl: './controller/index.js')    }))    .otherwise('/index');/* ./controller/index.js */DemoApp.register.controller('IndexController', ['$scope', '$require', function($scope, $require) {    ...    /* 动态加载某个js文件 */    $require(url).then(function () {        ...    });}]);

登录后复制

           

以上就是AngularJS如何实现动态加载Controller的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2772599.html

(0)
上一篇 2025年3月8日 13:22:11
下一篇 2025年3月8日 13:22:18

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎样开发最优的JS模块

    这次给大家带来怎样开发最优的JS模块,开发最优JS模块的注意事项有哪些,下面就是实战案例,一起来看一下。 不少人都曾经在 npm 上发布过自己开发的 JavaScript 模块,而在使用一些模块的过程中,我经常产生“这个模块很有用,但如果能…

    编程技术 2025年3月8日
    200
  • JS怎么判断客户端类型

    这次给大家带来JS怎么判断客户端类型,JS判断客户端类型的注意事项有哪些,下面就是实战案例,一起来看一下。 前言 我们在写响应式布局的时候,总要考虑是否是移动端,基于这个这里总结了4种方法判断客户端是否是ios或者android。分享出来供…

    编程技术 2025年3月8日
    200
  • 关于js设计模式的超详细介绍

    本篇文章给大家分享的内容是关于js设计模式的超详细介绍,有着一定的参考价值,有需要的朋友可以参考一下 js设计模式 Jan 14, 2017 | 学习笔记 | 3387 Hits 目录 前言 单体模式 工厂模式 迭代器模式 装饰者模式 策略…

    2025年3月8日
    200
  • 一些关于js的实用小算法

    本篇文章给大家分享的内容是一些关于js的实用小算法,有着一定的参考价值,有需要的朋友可以参考一下 判断文本是否为回文 定义:如果将一个文本翻转过来,能和原文本完全相等,那么就可以称之为“回文”。 方法一(字符串、数组内置方法) 登录后复制 …

    编程技术 2025年3月8日
    200
  • JS的Object值怎样合并

    这次给大家带来JS的Object值怎样合并,JS的Object值合并注意事项有哪些,下面就是实战案例,一起来看一下。 前言:在日常开发工作中我们可能会遇到js中对象中所有值的复制工作,也有可能是通过electron开发客户端,改版时候面临到…

    编程技术 2025年3月8日
    200
  • 怎样操作jackson解析json字符串时首字母的大小写转换

    这次给大家带来怎样操作jackson解析json字符串时首字母的大小写转换,操作jackson解析json字符串时首字母大小写转换的注意事项有哪些,下面就是实战案例,一起来看一下。 问题 楼主碰到的问题是,在实体类和表中定义的某个字段为RM…

    编程技术 2025年3月8日
    200
  • JS实现单例模式的步奏详解

    这次给大家带来JS实现单例模式的步奏详解,JS实现单例模式的注意事项有哪些,下面就是实战案例,一起来看一下。 传统单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 实现单例核心思想 无非是用一个变量来标志当前是否已经为某个类…

    编程技术 2025年3月8日
    200
  • JS怎样将json格式数组下载到excel表格里

    这次给大家带来js怎样将json格式数组下载到excel表格里,js将json格式数组下载到excel表格里的注意事项有哪些,下面就是实战案例,一起来看一下。 实例如下: $(document).ready(function(){ $(‘#…

    编程技术 2025年3月8日
    200
  • JS做出移动端触摸轮播效果

    这次给大家带来JS做出移动端触摸轮播效果,JS做出移动端触摸轮播效果的注意事项有哪些,下面就是实战案例,一起来看一下。 下面是移动端手指滑动轮播图的完整代码。 *{margin:0;padding:0;}li{list-style:none…

    2025年3月8日 编程技术
    200
  • JS的多线程运行库Nexus.js使用详解

    这次给大家带来JS的多线程运行库Nexus.js使用详解,使用JS多线程运行库Nexus.js的注意事项有哪些,下面就是实战案例,一起来看一下。 首先,如果你不熟悉这个项目,建议先阅读之前写的一系列文章。如果你不想阅读这些,不用担心。这里面…

    编程技术 2025年3月8日
    200

发表回复

登录后才能评论