AngularJS: lazy loading controllers and content

后端 未结 9 845
小鲜肉
小鲜肉 2020-12-02 19:00

In this simplified scenario, I have two files: index.htm, lazy.htm.

index.htm:

var myApp = angular.module(\'myApp\', []);
myApp.controller(\'embed\',         


        
9条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-02 19:48

    You can also use the jquery with the resolve the $routeProvider

    app.js

    /* Module Creation */
    var app = angular.module ('app', ['ngRoute']);
    
    app.config(['$routeProvider', '$controllerProvider', function($routeProvider, $controllerProvider){
    
    /*Creating a more synthesized form of service of $ controllerProvider.register*/
    app.registerCtrl = $controllerProvider.register;
    
    function loadScript(path) {
      var result = $.Deferred(),
      script = document.createElement("script");
      script.async = "async";
      script.type = "text/javascript";
      script.src = path;
      script.onload = script.onreadystatechange = function (_, isAbort) {
          if (!script.readyState || /loaded|complete/.test(script.readyState)) {
             if (isAbort)
                 result.reject();
             else
                result.resolve();
        }
      };
      script.onerror = function () { result.reject(); };
      document.querySelector("head").appendChild(script);
      return result.promise();
    }
    
    function loader(arrayName){
    
        return {
          load: function($q){
                    var deferred = $q.defer(),
                    map = arrayName.map(function(name) {
                        return loadScript('js/controllers/'+name+".js");
                    });
    
                    $q.all(map).then(function(r){
                        deferred.resolve();
                    });
    
                    return deferred.promise;
            }
        };
    }
    
    $routeProvider  
        .when('/', {
            templateUrl: 'views/foo.html',
            resolve: loader(['foo'])
        })
        .when('/bar',{
            templateUrl: 'views/bar.html',
            controller: 'BarCtrl',
            resolve: loader(['bar'])
        })
        .otherwise({
            redirectTo: document.location.pathname
        });
    }]);
    

    /views/foo.html

    {{text}}

    js/controllers/foo.js

    /*Here we use the synthesized version of $controllerProvider.register 
    to register the controller in view*/
    app.registerCtrl('FooCtrl',function($scope){
        $scope.text = 'Test';
    });
    

    /views/bar.html

    {{text2}}

    js/controllers/bar.js

    app.registerCtrl('BarCtrl',function($scope){
        $scope.text2 = 'Test';
    });
    

提交回复
热议问题