1

サンドボックスを処理するメディエーター オブジェクトを取得しました。

各サンドボックスはメディエーターに登録する必要があります。私はrequirejsも使用しているため、プロトタイプではなくインスタンスを共有する方法がわからないため、これは少し問題です。

mediator.js

define([], function() {
    var Mediator = function() {};
    Mediator.prototype.start = function() {};
    Mediator.prototype.stop = function() {};
    Mediator.prototype.register = function() {};
    Mediator.prototype.unregister = function() {};
    return Mediator;
});

sandbox_one.js

define(['mediator'], function(Mediator) {
    var mediator = new Mediator();
    mediator.register('sandboxOne', SandboxObject);
});

sandbox_two.js

define(['mediator'], function(Mediator) {
    var mediator = new Mediator();
    mediator.register('sandboxtwo', SandboxObject);
});

現在のアプローチで述べたように、2 つの異なるメディエーターにサンドボックスを登録します。これを解決する 1 つのアイデアは、シングルトン パターンを使用することですが、これはアーキテクチャと requirejs の推奨事項と競合します。

では、サンドボックスがすべて Mediator の同じインスタンスに登録されるようにするには、他にどのような方法が必要でしょうか?

4

2 に答える 2

2

コメントは投稿できないので、回答を投稿します。

ggozadは、RequireJSでシングルトンを実行する方法をここで説明しています。requireJSモジュールをシングルトンとして使用するのは悪い習慣ですか?

彼のコード:

define(function (require) {
    var singleton = function () {
        return {
            ...
        };
    };
    return singleton();
});
于 2012-09-23T09:22:59.210 に答える
0

実際、RequireJSを使用すると、すでにシングルトンを受け取っているため、以下を呼び出すと:

require(['mediator'], function(Mediator) {
  ....
});

Mediator常に同じオブジェクトになります。コンストラクター関数の場合、呼び出しによってnew Mediator()常に新しいインスタンスが作成されますが、毎回同じ関数を使用します。

ただし、関数を返す必要はありません。

define([], function() {
    return {
        start: function() {},
        stop: function() {},
        register: function() {},
        unregister: function() {}
    };
});

これMediatorで、関数ではなくインスタンスになり、関数として使用できなくなります。あなたの例は次のようになります。

require(['mediator'], function(Mediator) {
  Mediator.register('sandboxOne', SandboxObject);
});

免責事項: DojoでRequireJSバージョンのビルドを使用しています。

于 2014-02-26T13:25:01.157 に答える