在延迟加载角度时加载外部模块

时间:2015-10-25 05:31:54

标签: javascript angularjs requirejs

我可以在requirejs的帮助下延迟加载angularjs。但是,如何加载需要与控制器关联的模块?

我在app.js中的示例配置如下所示,加载所有提供程序并保留引用。

Collections::toArray(T[])

在我的其他模块中,我正在尝试注册控制器,加载服务..

var app = angular.module('myApp', ['ui.router'])

var cacheProviders = {};

    app.getProvider = function () {
        return cacheProviders.$provide;
    }

    app.getCompileProvider = function () {
        return cacheProviders.$compileProvider;
    }

    app.getControllerProvider = function () {
        return cacheProviders.$controllerProvider;
    }

    app.getFilterProvider = function () {
        return cacheProviders.$filterProvider;
    }

app.config(['$stateProvider', '$urlRouterProvider', '$controllerProvider', '$compileProvider', '$filterProvider', '$provide',
            function ($stateProvider, $urlRouterProvider, $controllerProvider, $compileProvider, $filterProvider, $provide) {

            (function () {
                cacheProviders.$controllerProvider = $controllerProvider;
                cacheProviders.$compileProvider = $compileProvider;
                cacheProviders.$filterProvider = $filterProvider;
                cacheProviders.$provide = $provide;
            })();

            var lazyCtrlLoad = function (controllerName) {
                return ["$q", function ($q) {
                    var deferred = $q.defer();
                    require([controllerName], function () {
                        deferred.resolve();
                    });
                    return deferred.promise;
                }];
            }
             $stateProvider.state('main.view2b', {
                    url: '/view2b',
                    templateUrl: 'forms/empl/searchEmplForm.html',
                    controllerAs: 'srchC',
                    controller: 'searchEmplCtrl',
                    resolve: {
                        loadOtherCtrl: lazyCtrlLoad('searchEmplCtrl')
                    }
                })

但是,在下面加载服务时,我需要访问$ resource,它是angularResource中ngResource模块的一部分。

define([
        'angular', 'angularResource'
    ], function (angular) {
      angular.module('myApp')
        .getControllerProvider()
        .register(ctrl, ...)

如何在懒惰地使javascript控制器/服务初始化时加载ngResource?

1 个答案:

答案 0 :(得分:0)

查看AngularAMD here。它允许您在不使用lazyload的情况下在ui-router中加载控制器。此AngularAMD用于集成requireJs和Angular。

$stateProvider
  .state('home', {
    url: '',
    views: {
      '@': angularAmd.route({
        templateUrl: 'ngApplication/application/shared/layouts/basic/basicTplView.html',
        controllerUrl: 'ngApplication/application/shared/layouts/basic/basicTplCtrl.js',
        controller: 'basicTplCtrl'
       }),
      'header@home': angularAmd.route({
         templateUrl: 'ngApplication/application/shared/layouts/header/headerView.html',
         controllerUrl: 'ngApplication/application/shared/layouts/header/headerCtrl.js',
         controller: 'headerCtrl'
       })
    },
});

此外,您正在使用requirejs,您可以使用requireJs的define语法加载特定控制器的所有依赖项。我们假设你想在一个单独的文件中创建一个loginCtroller,这个控制器依赖于另一个角度服务:

define(['app', 'transformRequestAsFormPostService'], function (app) {
    app.controller('loginCtrl', ['$scope', '$rootScope', '$sce', '$http', '$state', 'transformRequestAsFormPostService', function ($scope, $rootScope, $sce, $http, $state, transformRequestAsFormPost) {

      $scope.login = function () {
        /*do something here using the service*/          
      };
    }]);
});

这里,名为transformRequestAsFormPostService的依赖项是另一个文件,我在main.js(requireJs confifguration文件)中定义它,并使用与loginCtrol相同的方法定义它。现在我在我的项目中使用它并且它的工作到目前为止一直很好。

问候,

埃内斯托