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

andの概念を間違って使用しているようrequireです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();

../Ndn/Widgetネストされた require() ロジックがモジュール内でまだ実行されているかどうかを知らずに実行されていました。

appこれを修正する 1 つの解決策は、グローバル 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 に答える