Home > Web Front-end > JS Tutorial > body text

How to dynamically load Controller in AngularJS

零到壹度
Release: 2018-04-13 17:29:15
Original
1815 people have browsed it

The content of this article is to share with you how to dynamically load Controller in AngularJS. It has certain reference value. Friends in need can refer to it.

We will implement dynamic loading of Controller The method is encapsulated into a common module and named this module ngCommon.

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

Next we implement a method of dynamically loading 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 < 1.2.x 请使用$timeout */
                    $rootScope.$evalAsync(function () {
                        deferred.resolve();
                    });
                }
                script.onload = script.onerror = null;
                body.removeChild(script);
                script = null;
            };
            script.onload = onload;
            script.onerror = function () {
                onload(1);
            };
            script.async = true;
            script.src = url;
            body.appendChild(script);
        }
        return deferred.promise;
    };}]);
Copy after login

Then the key point is to dynamically load the Controller through the resolve function of $routeProvider route.

CommonApp.provider(&#39;$routeResolver&#39;, 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: [&#39;$route&#39;, &#39;$require&#39;, &#39;ControllerChecker&#39;,
                    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;
    };})
Copy after login

Looking at the above code, something called ControllerChecker is also injected. This is used to detect whether the current Controller has been registered. If it is not registered, then we will load the relevant js to register a new one. Controller. The code is as follows:

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

Finally, let’s add a registration method.

CommonApp.setupRegister = function (module) {
    module.config([
        &#39;$controllerProvider&#39;,
        &#39;$compileProvider&#39;,
        &#39;$filterProvider&#39;,
        &#39;$provide&#39;,
        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            };
        }
    ]);};
Copy after login

This is basically complete, how to use it?

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

     

The above is the detailed content of How to dynamically load Controller in AngularJS. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!