0

現在、バックボーンとマリオネットで古いアプリを書き直しています。私のモジュール ファイル spls.module.insight.js では:

spls.module('Insight', {
    startWithApp: false,
    define: function(self, spls, Backbone, Marionette, $, _) {

        self.start = function () {
            console.log('Insight started!');
        }

        self.addInitializer(function() {
           console.log('Insight instantiated!');
        });
    }
});

モジュールの start() を待機するときに使用する通常のメソッドであると考えたため、start() メソッドにフックしようとしています。(一度しか初期化されないので、イニシャライザを使用できません。しかし、他に何がありますか?) spls.module('Insight').start(); への 2 回目の呼び出しで。「Insight が開始されました!」という 2 つのメッセージを受け取ります。メッセージ。どうしてこれなの?

これを解決するより良い方法はありますか?


達成したいことに関する詳細情報: Marionette を使い始めたばかりなので、モジュールが何を行い、どのように相互作用するかについてまだ深く理解していません。私が達成したかったのは、基本的に、ルーターを介してページ (モジュール) を開くメインアプリ (作品) でした。現在、私は電話しています

Spls.module('Insight').start();

ルーターからですが、モジュール自体の設計方法がわかりません。初期化子は最初の .start() でのみ呼び出されるように見えるため、モジュールはその内容をいつ表示するかを知りません。そのようにイベントアグリゲーターを使用する必要がありますか?

// router
Spls.module('Insight').start();
Spls.vent.trigger('insight:show');

// module
Spls.vent.on('insight:show', function () {  /* show index */ });

基本的に、モジュールの操作方法に関する詳細情報が必要ですが、これに関する適切なワークフローに関する適切な情報が見つかりませんでした。

再度、感謝します!

4

1 に答える 1

2

start メソッドをオーバーライドしないでください。すでに見てきたように、イニシャライザが実行されず、他の舞台裏のコードが実行されないなど、悪いことが起こります。

モジュールの開始時にコードを実行する必要がある場合は、初期化子を使用します。モジュールの停止時にコードを実行する必要がある場合は、ファイナライザーを使用します。start メソッドと stop メソッドは、イニシャライザ、ファイナライザ、およびその他のいくつかの必要なものを舞台裏で実行します。

そのメッセージが 2 回表示されることについては、簡単なテストでは、このメッセージが 2 回表示されることはありません。一度しか見ていません。同じ名前の 2 番目のモジュール (分割モジュール定義) を定義している別のコードがありますか、またはそれらの行に沿って何か他のものがありますか?


追加の質問の更新:

複数回呼び出すと、モジュールstartも呼び出した場合にのみ初期化子が再実行stopされます。


Spls.module("Insight").start();

// some time later...
Spls.module("Insight").stop();

// now it can be re-started and the initializers will run again
Spls.module("Insight").start();

現在実行中のモジュールを追跡できます。その後、新しいルートが起動したら、次のルートを開始する前に現在のルートを停止できます。それは正しく機能するのに十分なはずです:


insightRoute: function(){
  if (this.module){
    this.module.stop();
  }
  this.module = Spls.module("Insight");
  this.module.start();
}

これは、ルーターのメソッド、または Marionette の AppRouter を使用している場合はルーターが呼び出すオブジェクトに簡単に抽出できます。

それが役立つことを願っています。

于 2012-09-12T23:36:29.220 に答える