【问题标题】:Using angularJS with requireJS - cannot read property 'module' of undefined将angularJS与requireJS一起使用-无法读取未定义的属性“模块”
【发布时间】:2014-02-26 06:56:41
【问题描述】:

我已经开始使用 angularJS 编写应用程序。几周后,我突然意识到我应该从一开始就使用 require JS 来加载我的模块。是的,我知道,这很愚蠢。但是它就是这样啊。 所以我现在尝试将我的代码转换为适合 requireJS。

这是我的 main.js

requirejs.config({
baseUrl: "js",
paths: {
    jquery:'jquery-1.7.min',
    angular: 'angular',
    angularRoute:'angular-route',
    mainApp:'AngularApp/app'

},
 priority:['angular'],
shim:{

    angularRoute:{
        deps:["angular"]
    },
    mainApp:{
        deps:['angularRoute']
    }
}});

require(['angular','angularRoute', 'mainApp'],
    function(angular, angularRoute, app)
    {
        angular.bootstrap(document, ['ServiceContractModule']);
    });

这是我的 app.js

define(['angular',
    'angularRoute',
    'AngularApp/services',
    'AngularApp/directives',
    'AngularApp/controllers'],
    function(angular, angularRoute, services, directives, controllers)
    {
        console.log("sup");
        var serviceContractModule = angular.module('ServiceContractModule',[ 'ngRoute', services, directives, controllers ]);
        serviceContractModule.config(function($routeProvider,$locationProvider) {
            $routeProvider.when('/contractNumber/:contractNumbers', {
                controller : 'ContractController',
                templateUrl : './contractSearchResult',
                reloadOnSearch : true
            }).when('/serialNumber/:serialNumbers', {
                controller : 'SerialController',
                templateUrl : './serialSearchResult'
            }).when('/QuoteManager',{
                controller : 'QuoteManagerController',
                templateUrl: './quoteManagerView'
            }).when('/QuoteManagerHome',{
                controller : 'QuoteManagerController',
                templateUrl: './quoteManagerHome'
            });
        });

        return serviceContractModule;
    });

这是我的directions.js 文件

define(['angular',
    'AngularApp/Directives/tableOperations',
    'AngularApp/Directives/line',
    'AngularApp/Directives/listOfValues'],
    function(
    angular,
    tableOperations,
    line,
    listOfValues)
    {
        var directiveModule = angular.module('ServiceContractModule.directives');
        directiveModule.directive('tableoperations', tableOperations);
        directiveModule.directive('line', line);
        directiveModule.directive('listOfValues', listOfValues);
        return directiveModule;
    }

)

这是我的 services.js 文件

define(['angular',
    'AngularApp/Services/quoteManagerSearch'],
    function(angular, quoteManagerSearch)
    {
        var serviceModule = angular.module('ServiceContractModule.services');
        serviceModule.factory('searchRequestHandler', quoteManagerSearch);
        return serviceModule;
    }

)

当我运行我的页面时,我得到的当前错误是

Uncaught TypeError: Cannot read property 'module' of undefined directives.js:14

Uncaught TypeError: Cannot read property 'module' of undefined services.js:5

这似乎发生在这一行

var directiveModule = angular.module('ServiceContractModule.directives');

我认为由于某种原因,角度文件没有被加载。虽然当我运行页面时,我可以看到所有 js 文件在 chrome 中都以正确的顺序加载。

有什么想法吗?需要快速帮助!谢谢!

【问题讨论】:

  • 将角度更改为 $angular
  • 嗯,但我已将 angular 模块的别名定义为“angular”本身。为什么我需要这样做?
  • 你调用了角度参考脚本吗?
  • 是的。在 main.js 中,我在路径中指定了 angular:'angular'。角度文件的路径是 js/angular.js。我已将 baseurl 指定为 js。此外,当我加载页面时,我实际上可以看到在 main.js 之后加载了 angular.js 文件。

标签: javascript angularjs requirejs angular-routing


【解决方案1】:

查看 Angular 的源代码,我没有看到它调用 RequireJS'define 的任何地方,因此您需要一个 shim。将此添加到您的 shim 配置中:

angular: {
    exports: "angular"
}

顺便说一句,您的配置中的 priority 字段已过时。您要么使用忽略此字段的 RequireJS 2.x,因为 priority 仅受 RequireJS 1.x 支持。或者您使用 RequireJS 1.x,它会尊重 priority,但会忽略 shim 字段,因为 shim 是在 2.x 中引入的。我的建议:使用 RequireJS 2.x 并删除 priority

【讨论】:

  • 嘿,非常感谢。这很有意义。我删除了优先级并添加了 angular 的导出属性。现在我似乎收到了 angularRoute 和 mainApp 的超时错误。 AngularRoute 似乎没有在 Angular 文件之后加载。我的依赖项有问题吗?
  • 从你的问题中我可以看到,没有什么能让我大吃一惊。当您检查浏览器发出的网络请求时,它是否为angularRoutemainApp 下载了正确的内容?
  • 不。它加载 main.js,然后加载 angular.js 并停止。我还为 angularRoute 添加了 exports 属性。无论哪种方式,我都试过了。两次同样的错误。
  • 如果您加载为mainApp 的模块与您使用“这是我的app.js”引用的模块相同,那么您不需要为它配置shim,因为您使用define 来定义它。这可以解释您遇到的一些问题。
  • 是的,我做到了。但是奇怪的事情发生了。 App.js 似乎在 Angular 之前加载。这真的很奇怪,正如我在 app.js 的定义标记中提到的那样。对于 angularRoute,同样的早期问题仍然存在。就是不加载。所有其他模块似乎都加载了。这是一些非常奇怪的行为。也许其他一些文件被导入到其他地方并导致一些问题。
【解决方案2】:

您的设置可能存在 2 个问题:
1.您在main.js 中引导角度,然后加载依赖项。
2. 您应该使用字符串引用依赖项

因此,从您的 main.js 中删除 angular.bootstrap 后,请尝试以下操作:

app.js

define([
    'AngularApp/services',
    'AngularApp/directives',
    'AngularApp/controllers'],
    function()
    {
        console.log("sup");
        var serviceContractModule = angular.module('ServiceContractModule',[ 'ngRoute', 'ServiceContractModule.services', 'ServiceContractModule.directives', '<<Your Controller Module Name>>' ]);
        serviceContractModule.config(function($routeProvider,$locationProvider) {
            $routeProvider.when('/contractNumber/:contractNumbers', {
                controller : 'ContractController',
                templateUrl : './contractSearchResult',
                reloadOnSearch : true
            }).when('/serialNumber/:serialNumbers', {
                controller : 'SerialController',
                templateUrl : './serialSearchResult'
            }).when('/QuoteManager',{
                controller : 'QuoteManagerController',
                templateUrl: './quoteManagerView'
            }).when('/QuoteManagerHome',{
                controller : 'QuoteManagerController',
                templateUrl: './quoteManagerHome'
            });
        });

        angular.bootstrap(document, ['ServiceContractModule']);
    });

查看我为帮助使用 RequireJS 和 AngularJS 而创建的 angularAMDhttp://marcoslin.github.io/angularAMD/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2013-01-15
    • 2017-09-14
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2016-06-19
    • 2016-02-25
    相关资源
    最近更新 更多