2

私は ActionScript 3 開発者で、大規模な JavaScript アプリを作成する最初の方法を作成したばかりです。したがって、私はモジュールを理解し、AMD が使用するのに適したパターンであることを理解しています。RequireJS について読んで実装しました。しかし、私がまだ理解していないのは、クロスモジュール通信を実現する方法です。なんらかのメディエーターが必要であることは理解しています...記事や投稿を読んでも、簡単に実装する方法がわかりませんでした。これが私のコードです。

main.js

require(["Player", "AssetsManager"], function (player, manager) {
    player.loadXML();
});

Player.js

define(function () {
    function parseXml(xml)
    {
        // NOW HERE IS THE PROBLEM -- how do I call AssetsManager from here???

        AssetsManager.queueDownload($(xml).find("prop").text());
    }

    return {
        loadXML: function () {
            //FUNCTION TO LOAD THE XML HERE, WHEN LOADED CALL parseXml(xml)
        }

    }

});

AssetsManager.js

define(function () {
    var arrDownloadQueue = [];

    return {
        queueDownload: function(path) {
            arrDownloadQueue.push(path);
        }
    }
});

「ダミー用」のヘルプをいただければ幸いです:)ありがとうございます。

4

2 に答える 2

1

別のモジュールからモジュールをロードするdefine()には、最初のパラメーターを配列として設定し、その中にモジュール名を入れます。たとえば、コードで にロードPlayer.jsするAssetsManager.js場合は、単純に文字列Playerを配列に含めます。

これが可能なのは、defineの抽象実装が と同等でrequireあり、 に渡されたコールバックがdefine値が返されることを期待しており、ロードできる依存関係のリストに「モジュール」を追加するためだけです。

AssetsManager.js

define(['Player'], function (player) {
    //... Your code.
});

ただし、追加できる場合は、コールバックにパラメーターを渡すのではなく、require渡されたコールバックの内部を使用defineして、ロードする依存関係を取得することを個人的に好みます。

だからここに私の提案があります:

define(['Player'], function () {
    var player = require('Player');
});

これは、CommonJSとより調和しているからです。

これは、main.jsより CommonJS に適した形式にフォーマットされているように見える方法です。

require(["Player", "AssetsManager"], function () {
    var player = require('Player');
    var manager = require('AssetsManager');
    player.loadXML();
});

しかし、CommonJS のやり方は個人的な好みにすぎません。私の理論的根拠は、配列に依存関係名を入力する順序がいつでも変更される可能性があり、配列とパラメーター リストの両方をステップ実行する必要がないことです。

私のもう 1 つの理論的根拠 (ただし、これは単なる衒学的な話です) は、私が Node.js の世界から来たということですrequire()

しかし、それはあなた次第です。

于 2012-07-16T05:36:11.643 に答える
0

(これはskizeeyの回答への返信になりますが、それに対する評判は十分ではありません)

この問題を require 経由で Player の AssetManager 依存関係を引き込まずに解決する別の方法は、main.js が既に持っている AssetManager インスタンスを渡すことです。これを実現する方法の 1 つは、Player の loadXML 関数が AssetManager パラメーターを受け入れ、それが parseXml に渡されて使用されるようにすることです。もう 1 つの方法は、parseXml によって読み取られる AssetManager を保持する変数を Player に持たせることです。直接設定するか、AssetManager を変数に格納する関数を使用できます (setAssetManager など)。ただし、この後者の方法には追加の考慮事項があります。その場合、loadXml を呼び出す前に、その変数が設定されていない場合を処理する必要があります。この概念は、一般に「依存性注入」と呼ばれます。

明確にするために、AMDを使用してロードすることをお勧めしているわけではありません。より多くのオプションを提供したかっただけです。おそらく、この手法は、別の問題を解決するときに便利になるかもしれませんし、他の人を助けるかもしれません. :)

于 2012-12-20T04:57:04.950 に答える