Javascript 所有AngularJS控制器未加载LazyLoad

Javascript 所有AngularJS控制器未加载LazyLoad,javascript,angularjs,requirejs,lazy-loading,angularjs-controller,Javascript,Angularjs,Requirejs,Lazy Loading,Angularjs Controller,我正在尝试为我的AngularJS应用程序延迟加载我的控制器,我是在requireJS旁边构建的。我已经创建了一个自定义的“lazyLoad”库,它在app.config()路由中创建了一个resolve对象(我也在使用ui路由器)。如果我将状态(没有我的库)编码为这样,它就会工作 define(['angular', 'lazyLoader', 'uiRouter'], function(angular, lazyLoader, uiRouter){ var app = angula

我正在尝试为我的AngularJS应用程序延迟加载我的控制器,我是在requireJS旁边构建的。我已经创建了一个自定义的“lazyLoad”库,它在app.config()路由中创建了一个resolve对象(我也在使用ui路由器)。如果我将状态(没有我的库)编码为这样,它就会工作

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;

});
如果我尝试用我的库函数替换resolve对象,它将如下所示:

define(['angular', 'lazyLoader', 'uiRouter'], function(angular, lazyLoader, uiRouter){

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显示了这一点),但它无法解析上面示例中的“模块”

链接到错误:

同样,这个问题只在使用lazyloader时发生,lazyloader生成的解析对象与我为有效版本硬编码的解析对象相同

我到处搜索,有很多资源,但我找不到任何解决这个问题的方法


任何建议都将不胜感激

在“myApp”模块定义中,您不应该返回
app
变量而不是
myApp

为了避免将lazy暴露于窗口,您可以将其定义为
app
变量的属性,这样在定义新函数时,您首先需要
app
,并且可以使用它:

app.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});
controller.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});

在“myApp”模块定义中,是否应该返回
app
变量而不是
myApp

为了避免将lazy暴露于窗口,您可以将其定义为
app
变量的属性,这样在定义新函数时,您首先需要
app
,并且可以使用它:

app.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});
controller.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});

在“myApp”模块定义中,是否应该返回
app
变量而不是
myApp

为了避免将lazy暴露于窗口,您可以将其定义为
app
变量的属性,这样在定义新函数时,您首先需要
app
,并且可以使用它:

app.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});
controller.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});

在“myApp”模块定义中,是否应该返回
app
变量而不是
myApp

为了避免将lazy暴露于窗口,您可以将其定义为
app
变量的属性,这样在定义新函数时,您首先需要
app
,并且可以使用它:

app.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});
controller.js

app.lazy = {
        controller: $controllerProvider.register,
        directive: $compileProvider.register,
        filter: $filterProvider.register,
        factory: $provide.factory,
        service: $provide.service
    };
...
return app;
define(['app'], function (app) {
    app.lazy.controller('header-controller', ['$scope', function ($scope) {
        // stuff here
    }]);
});

你花了太多的精力来延迟加载控制器和服务。有一种简单的方法可以通过ocLazyLoad延迟加载文件。本文可能会帮助您解决相同的问题。

你应该做的是

添加ocLayzLoad的引用&更新的JS文件的引用,以便根据需要从其视图的app.JS或.html文件中加载

`bower install oclazyload --save-dev`
现在在应用程序中加载模块'oc.lazyLoad'。更新app.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>

你的html在这里

如果使用Grunt,请将GrunFile更新为uglyfy,重命名文件名并更新final.html或.js文件中的引用

延迟加载控制器和服务让您付出了太多的痛苦。有一种简单的方法可以通过ocLazyLoad延迟加载文件。本文可能会帮助您解决相同的问题。

你应该做的是

添加ocLayzLoad的引用&更新的JS文件的引用,以便根据需要从其视图的app.JS或.html文件中加载

`bower install oclazyload --save-dev`
现在在应用程序中加载模块'oc.lazyLoad'。更新app.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>

你的html在这里

如果使用Grunt,请将GrunFile更新为uglyfy,重命名文件名并更新final.html或.js文件中的引用

延迟加载控制器和服务让您付出了太多的痛苦。有一种简单的方法可以通过ocLazyLoad延迟加载文件。本文可能会帮助您解决相同的问题。

你应该做的是

添加ocLayzLoad的引用&更新的JS文件的引用,以便根据需要从其视图的app.JS或.html文件中加载

`bower install oclazyload --save-dev`
现在在应用程序中加载模块'oc.lazyLoad'。更新app.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>

你的html在这里

如果使用Grunt,请将GrunFile更新为uglyfy,重命名文件名并更新final.html或.js文件中的引用

延迟加载控制器和服务让您付出了太多的痛苦。有一种简单的方法可以通过ocLazyLoad延迟加载文件。本文可能会帮助您解决相同的问题。

你应该做的是

添加ocLayzLoad的引用&更新的JS文件的引用,以便根据需要从其视图的app.JS或.html文件中加载

`bower install oclazyload --save-dev`
现在在应用程序中加载模块'oc.lazyLoad'。更新app.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>

你的html在这里

如果使用Grunt,请将GrunFile更新为uglyfy,重命名文件名并更新final.html或.js文件中的引用

对不起,这是我的问题代码中的一个错误。我目前正在返回应用程序,但仍然遇到错误。其余的对我来说很好,如果没有其余的代码,很难说更多。但有一件事我注意到了,你“需要”控制器文件,但你没有将控制器的名称分配给州,对吗?尝试设置它:“TopNav”:{templateUrl:'views/home/top