开箱即用Angular不支持延迟脚本加载。我已经为这个问题创建了一个解决方案,但对它的完成方式有疑问。
在下面的 exampleModule.config()中,我已使用 $ controllerProvider.register 替换了默认的 module.controller 。这允许维护对控制器提供程序的引用,并允许控制器在稍后(当它们延迟加载时)向模块注册。
虽然这种方法有效并且我迄今没有遇到任何问题,但我确实怀疑这是否是正确的做法。 是否可以替换 module.controller 或者我是否在这个过程中不知不觉地破坏了Angular?
var module = angular.module("exampleModule", ["ngResource", "ngRoute"]);
module.config(function ($provide, $compileProvider, $controllerProvider, $filterProvider, $routeProvider) {
// Define the routes with their script dependencies
var routeConfig = { ... omitted for brevity };
// Retain the angular providers for use when resources are lazily loaded
module.factory = $provide.factory;
module.service = $provide.service;
module.directive = $compileProvider.directive;
module.controller = $controllerProvider.register;
module.filter = $filterProvider.register;
// Add route "dependencies" to the route resolve configuration
angular.forEach(routeConfig.routes, function (route, path) {
route.resolve = route.resolve || {};
// Add a new function to the resolve object. This function will use require.js
// to download all the dependent scripts before "resolving" the promise
route.resolve.requiredDependencies = ["$q", "$rootScope", function ($q, $rootScope) {
var deferred = $q.defer();
require(route.dependencies, function () {
deferred.resolve();
});
return deferred.promise;
}];
$routeProvider.when(path, route);
});
// Configure the default route using the route config
$routeProvider.otherwise({ redirectTo: routeConfig.defaultRoutePath });
});
我见过其他示例,其中 controllers.register 保留在另一个对象module.register.controllers = $controllerProvider.register;
中
但是这个解决方案有额外的开销,要求以非标准的方式声明每个懒惰加载的控制器。此外,由于在配置模块之前未创建 module.register 对象,因此无法急切加载这些控制器。上面包含的解决方案解决了这两个问题。但是以什么代价?
这是一个更完整的代码视图的要点。 https://gist.github.com/johngully/9964066