Angular Lazy Loading - 保留提供者是否可以?

时间:2014-04-04 15:57:57

标签: javascript angularjs requirejs lazy-loading

开箱即用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

0 个答案:

没有答案