我可以在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?
答案 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相同的方法定义它。现在我在我的项目中使用它并且它的工作到目前为止一直很好。
问候,
埃内斯托