首頁  >  文章  >  web前端  >  AngularJS如何實作動態載入Controller

AngularJS如何實作動態載入Controller

零到壹度
零到壹度原創
2018-04-13 17:29:151849瀏覽

這篇文章給大家分享的內容是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 < 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;
    };}]);

然後重點來了,透過$routeProvider routeresolve功能來實現動態載入Controller。

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;
    };})

看上面的程式碼中也注入了一個叫ControllerChecker的,這個是用來偵測目前Controller是否已經註冊了,如果未註冊,那麼我們就載入相關js註冊新的Controller。程式碼如下:

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;
            }
        }
    };}]);

最後我們來新增一個注動態冊的方法。

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            };
        }
    ]);};

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

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 () {
        ...
    });}]);

           

#

以上是AngularJS如何實作動態載入Controller的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn