Все контроллеры AngularJS не загружаются с LazyLoad

Я пытаюсь лениво загрузить свои контроллеры для моего приложения AngularJS, которое я создал вместе с requireJS. Я создал собственную библиотеку "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 в начале показывает это), но он не может разрешить "модуль" в примере выше.

ссылка на ошибку: AngularJS Error

Опять же, эта проблема возникает только при использовании моего lazyloader, который производит тот же объект разрешения, который я жестко запрограммировал для версии, которая работает.

Я искал высоко и низко, и там много ресурсов, но я не смог найти ничего, что решило бы эту проблему.

Любой совет приветствуется!

2 ответа

Вы слишком много мучаетесь, чтобы загружать контроллеры и службы. Существует простой подход к отложенной загрузке файлов с помощью ocLazyLoad. Эта статья может помочь вам решить ту же проблему. https://routerabbit.com/blog/convert-angularjs-yeoman-spa-lazyload/

Что вы должны сделать, это

Добавьте ссылку на ocLayzLoad и обновленную ссылку на файлы JS для загрузки по требованию из файла app.js или.html их представлений.

`bower install oclazyload --save-dev`

Теперь загрузите модуль "oc.lazyLoad" в приложении. Обновить файл app.js

angular
      .module('helloWorldApp', [
        'ngCookies',
        'ngResource',
        'ngRoute',
        'ngSanitize',
        'oc.lazyLoad',
])

Загрузите файл JS, добавив ссылку на файл JS в файл.html.

<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 во-первых, и вы можете использовать его:

app.js:

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;

controller.js:

define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});
Другие вопросы по тегам