【问题标题】:AngularAMD + RequireJS: Failed to instantiate module ngStorageAngularAMD + RequireJS:无法实例化模块 ngStorage
【发布时间】:2015-06-02 12:44:16
【问题描述】:

真的为这个发疯了:

我正在尝试将 AngularJS 和 RequireJS 结合起来。在几次尝试失败后,我转向AngularAMD。我遵循了基本流程,但我不断收到这个令人讨厌的错误:

未能实例化模块 ngStorage,原因是: 模块“ngStorage”不可用!您要么拼错了模块名称,要么忘记加载它...

ngStorage 是一个简单的 3rd 方 Angular 模块。

这是我的 ma​​in.js

require.config({
  paths: {
    angular: 'js/angular.min',
    angularAMD: 'js/angularAMD.min',
    ngload: 'js/ngload.min',
    ngStorage: 'js/ngStorage.min'
  },
  shim: {
    angularAMD: ['angular'],
    ngload: ['angularAMD'],
    ngStorage: ['angular'] // Also tried with ['angularAMD'], and without this line at all
  },
  deps: ['js/app']
});

还有我的 app.js

define(['angularAMD','ngStorage'], function(angularAMD) {
    var app = angular.module('tyleApp', ['ngStorage']);
    return angularAMD.bootstrap(app);   // Fails here...
});

我从应用程序中删除了所有其他内容,但在这里失败了......我做错了什么?

注意:我也尝试过:

define(['angularAMD','ngload!ngStorage'], function(angularAMD) {

然后我得到:

angularAMD 未初始化。需要先调用 angularAMD.bootstrap(app)。

【问题讨论】:

  • 确保从浏览器控制台实际加载了 ngStorage.min.js..
  • @nhaa123:好点:确实没有加载。但为什么不呢?
  • 你确定有 /js/ngStorage.min.js 可用吗? :)
  • @nhaa123:实际上它加载(由RequireJS)。我只是没有刷新控制台。

标签: javascript angularjs requirejs angular-amd ng-storage


【解决方案1】:

ngStorage 已经在 AMD 之后定义了,所以你不需要为此编写 shim。

require.config({
  paths: {
    angular: 'js/angular.min',
    angularAMD: 'js/angularAMD.min',
    ngload: 'js/ngload.min',
    ngStorage: 'js/ngStorage.min'
  },
  shim: {
    angularAMD: ['angular'],
    ngload: ['angularAMD'],

  },
  deps: ['js/app']
});

并且在您的 app.js 中,在您的路径中保留相同的 ngStorage 名称,这个名称可能是不同的字符串,如果您将其命名为另一个,在您的情况下,您的 app.js 看起来不错。

例如如果您在 paths 中使用另一个名称,比方说, 在路径中:
angularStorage: 'js/ngStorage.min'

您的 apps.js 将是:

define(['angularAMD','angularStorage'], function(angularAMD) {
    var app = angular.module('tyleApp', ['ngStorage']);
    return angularAMD.bootstrap(app);   
});

因此,您使用在 requireJS 中定义的“angularStorage”,并且 angular.module() 仍将使用在 ngStorage 源代码中定义的模块名称“ngStorage”。

【讨论】:

  • 感谢您的回答@twinday。不幸的是,我尝试不使用 shim(并且还使用了不同的 require 名称,正如您所建议的那样),但我无法让它工作。不幸的是,我已经放弃了 require.js ......所以我无法尝试新的解决方案。 (我确实认为这个问题是相关的——我可以设置一个简单的测试来检查我没有尝试过的提案)
  • 1. paths: { **ngStorage: 'bower_components/ngstorage/ngStorage'** }
  • 2.手动引导角度:require([ 'angular', 'ngStorage', 'app' // load app.js ], function(angular, app) { var $html = angular.element(document.getElementsByTagName('html')[0]); angular.element().ready(function() { angular.bootstrap(document, ['widgetApp']); }); });
  • 3.在 app.js 中:define([ 'angular' ], function(angular) { var myApp = angular.module('myApp', [ 'ngStorage' ]) })
  • 您的 cmets 中的解决方案似乎与您的答案中的解决方案有点不同。特别是你不使用angularAMD?另外,widgetApp 是什么?
猜你喜欢
  • 1970-01-01
  • 2014-05-28
  • 2014-05-30
  • 2014-06-04
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多