简体   繁体   English

可以在Angular中动态加载控制器

[英]Possible to dynamically load controllers in Angular

When I go to a specific view in my Angular project, every controller code is being load. 当我进入Angular项目中的特定视图时,每个控制器代码都在加载中。

I understand that it's possible to prevent this. 我知道可以避免这种情况。 But is it possible in the following situation? 但是在以下情况下可能吗?

App.js config: App.js配置:

app.config(['$stateProvider', '$urlRouterProvider', '$httpProvider',
  function($stateProvider, $urlRouterProvider, $httpProvider, $locationProvider) {
    $httpProvider.interceptors.push('AuthInterceptor');
    $stateProvider.state('home', {
      url: "/home",
      templateUrl: 'views/Home.html',
      controller: "MainController",
      onEnter: ['$state', 'auth', function($state, auth) {
        if (auth.isLoggedIn()) {
          $state.go('challenge');
        }
      }]
    }).state('login', {
      url: '/login',
      templateUrl: 'views/Login.html',
      controller: 'UserCtrl',
      onEnter: ['$state', 'auth', function($state, auth) {
        if (auth.isLoggedIn()) {
          $state.go('home');
        } else {
          //console.log("Niet ingelogd")
        }
      }]
    }).state('register', {
      url: '/register',
      templateUrl: 'views/Register.html',
      controller: 'UserCtrl',
      onEnter: ['$state', 'auth', function($state, auth) {
        if (auth.isLoggedIn()) {
          $state.go('home');
        }
      }]
    }).state('challenge', {
      url: '/challenges',
      templateUrl: 'views/Challenges.html',
      controller: 'ChallengeCtrl',
      onEnter: ['$state', 'auth', function($state, auth) {
        if (!auth.isLoggedIn()) {
          $state.go('login');
        }
      }]
    }).state('profile', {
      url: '/profile',
      templateUrl: 'views/Profile.html',
      controller: "ProfileCtrl",
      onEnter: ['$state', 'auth', function($state, auth) {
        if (!auth.isLoggedIn()) {
          $state.go('login');
        }
      }]
    }).state('policy', {
        url: '/policy',
        templateUrl: 'views/Policy.html',
        controller: 'AppCtrl'
    }).state('cookie', {
        url: '/cookie',
        templateUrl: 'views/Cookie.html',
        controller: 'AppCtrl'
    }).state('challengesdone', {
      url: '/challengesdone',
      templateUrl: 'views/Challengesdone.html',
      controller: 'ChallengesDoneCtrl',
      onEnter: ['$state', 'auth', function($state, auth) {
        if (!auth.isLoggedIn()) {
          $state.go('login');
        }
      }]
    }).state('forgot', {
        url: '/forgot',
        templateUrl: 'views/Forgot.html',
        controller: 'UserCtrl'
    }).state('reset', {
        url: '/reset?sptoken',
        templateUrl: 'views/Reset.html',
        controller: 'UserCtrl'
    });

    $urlRouterProvider.otherwise('home');
}]);

Can this be accomplished without the use of external libraries and are there alot of adjustments needed? 无需使用外部库就可以完成此操作吗?是否需要进行大量调整?

You need to use $controllerProvider in your config. 您需要在配置中使用$ controllerProvider

app._controller = app.controller
app.controller = function (name, constructor){
    $controllerProvider.register(name, constructor);
    return (this);
};

And then resolve this method in your route. 然后在您的路线中解决此方法。

.state('reset', {
        url: '/reset?sptoken',
      controller: 'UserCtrl',
      resolve: {
            deps : function ($q, $rootScope) {
                var deferred = $q.defer();
                require(["js/userCtrl"], function (tt) {
                    $rootScope.$apply(function () {
                        deferred.resolve();
                    });
                    deferred.resolve()
                });
                return deferred.promise;
            }
        },
        templateUrl: 'views/Reset.html'

    });

I have put together a CodePen for your. 我为您整理了一个CodePen

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM