0

在我的 main.js 文件中:

define(['require'], function(require) {
    require([
        '../libs/requirejs/plugins/domReady',
        '../core',
        '../ndn.2',
        '../Ndn/Widget'
    ],
    function(domReady) {
        // require('../Ndn/Widget'); // I tried this too, but it doesn't solve my problem

        console.log('Should have required everything...');

        domReady(function() {
            console.log('About to call init()');

            init();
        });
    }
)});

function init() {
    // Begin fetching this widget's delivery settings
    Ndn_Widget.fetchDeliverySettings();

    // ... Other code here ...
}

在我的 Ndn/Widget.js 文件中,我有以下内容:

var Ndn_Widget;

define(['require'], function(require) {
    require(['../ndn.2', './ServerInterface'], function() {
        /**
         * An associative array for the different delivery settings
         * @var Object
         */
        var deliverySettings = {};

        Ndn_Widget = {
            fetchDeliverySettings: function() {
                // ... code here
                console.log('Finished defining Ndn_Widget.');
            }
        };
    });
});

我希望我传递给 main.js 中的 define() 函数的匿名函数只会在“../Ndn/Widget.js”文件加载后执行,但情况并非总是如此。

这是我的 console.log 语句的示例:

Should have required everything...
About to call init()
Uncaught TypeError: Cannot call method 'fetchDeliverySettings' of undefined 
Just finished defining Ndn_Widget. 

有人可以告诉我我做错了什么吗?先感谢您!

4

2 回答 2

2

看起来您正在错误地使用requireand的概念define

  • 无需在模块之外定义变量。东西应该从模块中返回,而不是在它们之外修改。
  • 听上去define是为了定义一段有目的的代码。如果有帮助,请将这些视为您的课程
  • 用于require抓取您的模块并让它们进行交互。

我已经重写了你的例子来演示

main.js

require([
    '../libs/requirejs/plugins/domReady',
    '../Ndn/Widget',
    '../core'
], function(domReady, Ndn_Widget) {

    domReady(function() {
        Ndn_Widget.fetchDeliverySettings();
    });

});

Ndn/Widget.js

define(function(require) {
    require('../ndn.2');
    require('./ServerInterface');

    var deliverySettings = {};

    return {
        fetchDeliverySettings: function() {

        }
    };
});

如果您的其他依赖项不是 AMD 模块,并且您依赖于它们的返回值,那么您可能还需要使用shim 配置选项

我也鼓励您重新阅读有关模块定义的 API 文档

于 2013-03-27T19:31:43.790 回答
0

虽然在使用 AMD 时与全局范围进行交互是不受欢迎的,但它仍然是可行的。

我需要该../Ndn/Widget模块并错误地期望其嵌套的 require() 逻辑(如下所示)同步执行:

require(['../ndn.2', './ServerInterface'], function() {

然而,上述逻辑仅异步执行(正如“异步模块定义”所建议的那样)。模块中的以下代码main...

    Ndn_Widget.fetchDeliverySettings();

在不知道嵌套的 require() 逻辑是否已在../Ndn/Widget模块内执行的情况下执行。

解决此问题的一种解决方案是引入一个可由两个模块引用的新模块,例如一个app模块,该模块触发一个事件以让另一个模块知道现在定义了全局 Ndn_Widget 变量。

更新了 main.js 文件:

define(['require', 'app'], function(require, app) {
    require([
        '../libs/requirejs/plugins/domReady',
        '../core',
        '../ndn.2',
        '../Ndn/Widget'
    ],
    function(domReady) {
        console.log('Should have required everything...');

        app.on('ready', function() { // domReady(function() {
            console.log('About to call init()');

            init();
        });
    }
)});

function init() {
    // Begin fetching this widget's delivery settings
    Ndn_Widget.fetchDeliverySettings();

    // ... Other code here ...
}

更新了 Ndn/Widget.js 文件:

var Ndn_Widget;

define(['app', 'require'], function(require, app) {
    require(['../ndn.2', './ServerInterface'], function() {
        /**
         * An associative array for the different delivery settings
         * @var Object
         */
        var deliverySettings = {};

        Ndn_Widget = {
            fetchDeliverySettings: function() {
                // ... code here
                console.log('Finished defining Ndn_Widget.');
            }
        };

        app.trigger('ready');
    });
});
于 2014-07-28T19:47:26.863 回答