0

残念ながら、Backbone.Marionette モジュールとサブモジュールの起動を理解する際に問題が発生しました。イニシャライザは、1 回ずつ呼び出されるのではなく、複数回呼び出されます。

物事を予見可能な方法で機能させるために何をする必要がありますか?

PP = new Backbone.Marionette.Application();

PP.bind('start', function() {
    console.log('application start');

    PP.module('Routing').start();
    PP.module('Products').start();
});

PP.module('Routing', {
    startWithApp: false,
    define: function(Routing, PP, Backbone, Marionette, $, _) {
        Routing.addInitializer(function() {
            console.log('Routing.init');
        });                
    }
});

PP.module('Routing.ProductsRouting', {
    startWithApp: false,
    define: function(ProductsRouting, PP, Backbone, Marionette, $, _) {
        ProductsRouting.addInitializer(function() {
            console.log('ProductsRouting.init');
        });
    }
});

PP.module('Products', {
    startWithApp: false,
    define: function(Products, PP, Backbone, Marionette, $, _) {
        Products.addInitializer(function() {
            console.log('Products.init');
        });
    }
});

$(function() {
    PP.start();
});

(コードはJSFiddleとしても利用可能)

上記のコードは、コンソールに次の行を出力します。

  • 申請開始
  • ルーティング.init
  • ProductsRou​​ting.init
  • ルーティング.init
  • ProductsRou​​ting.init
  • Products.init
  • Products.init

そして、これは私が期待したものです:

  • 申請開始
  • ルーティング.init
  • Products.init

また、アプリですべてのモジュールを自動的に開始することにした場合 (すべてのモジュールで startWithApp: true を使用し、Routing モジュールと Products モジュールを手動で開始する必要はありません)、出力は次のようになります。

  • ルーティング.init
  • ProductsRou​​ting.init
  • ProductsRou​​ting.init
  • Products.init
  • 申請開始
4

3 に答える 3

3

これはv0.9.7で修正されていますhttps://github.com/derickbailey/backbone.marionette/blob/master/changelog.md#v097-view-commit-logs

于 2012-08-08T01:24:44.067 に答える
2

このgithub プル リクエストを Backbone.Marionette に実装することで、この問題は解決されます。しかし、おそらく Derick Bailey (Backbone.Marionette の作成者) はこれについて独自の意見を持っているでしょうか?

于 2012-08-06T19:02:45.000 に答える
0

モジュールが間違った順序でロードされているように見えるという問題がまだ残っている場合 - 私にとっての解決策はBackbone.history.start().

これが私の問題でした:

ブートストラップ.js

App.start();

App.js

App = new Backbone.Marionette.Application();

var _AppRouter = Backbone.AppRouter.extend({
  appRoutes: { 
    "" : "getStarted"
  },
  controller: App
});

App.getStarted = function() {
  console.log(App.MyModule.myMethod);  // undefined
  App.MyModule.myMethod();
}

App.addInitializer(function() {
  new _AppRouter();
  Backbone.history.start();
});

App.MyModule.js

App.module("MyModule", function(MyModule, App) {
  MyModule.myMethod = function() {
    console.log("in myMethod");       // never gets called
  }
});

この例では App.MyModule.myMethod が定義されていないため、アプリの起動時に何も起こりません。

私が発見した問題は、私が電話していた場所Backbone.history.start()です。この呼び出しを bootstrap.js ファイルに移動して、すべてのアプリ モジュールが適切に初期化された後にのみルートを呼び出すようにしました。

ブートストラップ.js

App.start();
Backbone.history.start();

簡単にピージー。

于 2012-10-26T13:44:24.160 に答える