Maison  >  Article  >  interface Web  >  Comment charger dynamiquement Controller dans AngularJS

Comment charger dynamiquement Controller dans AngularJS

零到壹度
零到壹度original
2018-04-13 17:29:151851parcourir

Le contenu de cet article est de partager avec vous comment charger dynamiquement Controller dans AngularJS. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer

Nous implémenterons la dynamique. chargement du Controller La méthode est encapsulée dans un module général et nommé ce module ngCommon.

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

Ensuite, nous implémentons une méthode de chargement dynamique de 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;
    };}]);

Ensuite, le point clé est de charger dynamiquement le contrôleur via la fonction $routeProvider route de resolve.

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

Voyez que le code ci-dessus injecte également quelque chose appelé ControllerChecker Ceci est utilisé pour détecter si le contrôleur actuel a été enregistré. Sinon, nous chargeons le js correspondant pour enregistrer un nouveau contrôleur. . Le code est le suivant :

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

Enfin, ajoutons une méthode d'inscription.

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

Ceci est fondamentalement complet. Comment l'utiliser ?

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

                                     

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn