我正在尝试延迟加载我的控制器,用于我与requireJS一起构建的AngularJS应用程序。 我创建了一个自定义的"lazyLoad"库,该库在app.config()路由中创建了一个解析对象(我也在使用ui-router)。 如果我将状态(没有我的库)编码为看起来像这样,它可以工作
define(['angular', 'lazyLoader', 'uiRouter'], function(angular, lazyLoader, uiRouter){
var app = angular.module('myApp', ['ui.router']);
app.config(function ($stateProvider, $urlRouterProvider, $controllerProvider, $compileProvider, $filterProvider, $provide) {
window.lazy = {
controller: $controllerProvider.register,
directive: $compileProvider.directive,
filter: $filterProvider.register,
factory: $provide.factory,
service: $provide.service
};
$urlRouterProvider.otherwise('/');
$stateProvider
.state('campaigns', {
url:'/campaigns',
views: {
"top-nav" : {
templateUrl: 'views/home/top-nav.html',
resolve : {
load : ['$q', '$rootScope', function($q, $rootScope){
var d = $q.defer();
require(['../app/controllers/header-controller'], function() {
$rootScope.$apply(function(){
d.resolve();
});
});
return d.promise;
}]
}
},
"fullpage": {
templateUrl: 'views/home/index.html',
resolve : {
load : ['$q', '$rootScope', function($q, $rootScope){
var d = $q.defer();
require(['../app/controllers/home-controller'], function() {
$rootScope.$apply(function(){
d.resolve();
});
});
return d.promise;
}]
}
//controller: 'home-controller'
}
}
});
});
return app;
});
如果我尝试用我的库函数替换解析对象,它看起来像这样:
define(['angular', 'lazyLoader', 'uiRouter'], function(angular, lazyLoader, uiRouter){
和
.state('home', lazyLoader.route({
url:'/',
views: {
"top-nav" : {
templateUrl: 'views/home/top-nav.html',
controllerUrl: '../app/controllers/header-controller'
},
"fullpage": {
templateUrl: 'views/home/index.html',
controllerUrl: '../app/controllers/home-controller'
}
}
}));
lazyLoader.js
define(function () {
'use strict';
function LazyLoader() {}
LazyLoader.prototype.route = function(config){
var controllerPath;
if(config && config.views){
var singleView = Object.keys(config.views);
for(var i in singleView){
var viewName = singleView[i];
controllerPath = config.views[viewName].controllerUrl;
delete config.views.controllerUrl;
config.views[viewName].resolve = {
load : ['$q', '$rootScope', function($q, $rootScope){
var d = $q.defer();
require([controllerPath], function() {
$rootScope.$apply(function(){
d.resolve();
});
});
return d.promise;
}]
};
}
}
return config;
}
return new LazyLoader();
});
示例控制器
define(['app/module'], function (module) {
lazy.controller('header-controller', ['$scope', function ($scope) {
// stuff here
}]);
});
附带说明一下,我计划实现比将惰性变量附加到窗口更好的东西。
当我像第一个示例一样对路由器进行编码时,它可以工作。 当我使用我的 lazyLoader 时,两个视图中的一个加载它的控制器,第二个视图的控制器文件开始加载(开头的 console.logs 显示了这一点),但它无法解析上面示例中的"模块"。
链接到错误:角度JS错误
同样,此问题仅在使用我的懒惰加载程序时发生,该加载程序正在生成与我为有效版本硬编码的相同解析对象。
我已经搜索了高处和低处,那里有很多资源,但我找不到解决这个问题的任何内容。
任何建议不胜感激!
你太痛苦了,无法延迟加载控制器和服务。有一个简单的方法可以使用ocLazyLoad延迟加载文件。本文可能会帮助您解决相同的问题。https://routerabbit.com/blog/convert-angularjs-yeoman-spa-lazyload/
你应该做的是
添加ocLayzLoad的引用和更新的JS文件的引用,以按需从应用程序加载.js或.html其视图的文件。
`bower install oclazyload --save-dev`
现在在应用程序中加载模块'oc.lazyLoad'。更新应用.js文件
angular
.module('helloWorldApp', [
'ngCookies',
'ngResource',
'ngRoute',
'ngSanitize',
'oc.lazyLoad',
])
通过在.html文件中添加JS的引用来加载JS文件
<div oc-lazy-load="['scripts/controllers/about.js', 'scripts/services/helloservice.js']">
<div ng-controller="AboutCtrl as about">
Your html goes here
</div>
</div>
如果您使用 Grunt,请将 Gruntfile 更新为 uglyfy,重命名文件名并更新最终 .html 或.js文件中的引用。
在"myApp"模块定义中,您不应该返回app
变量而不是myApp
吗?
为了避免向窗口暴露懒惰,您可以将其定义为app
变量的属性,这样当您定义新函数时,您首先需要app
,您可以使用它:
应用.js:
app.lazy = {
controller: $controllerProvider.register,
directive: $compileProvider.register,
filter: $filterProvider.register,
factory: $provide.factory,
service: $provide.service
};
...
return app;
控制器.js:
define(['app'], function (app) {
app.lazy.controller('header-controller', ['$scope', function ($scope) {
// stuff here
}]);
});