1

現在、Backbone.js Marionette フレームワークを使用して既存のアプリケーションを書き直しています。新しいコントローラを簡単に追加できるように、新しいスタックはかなりモジュール化されている必要があります。アプリケーションには node.js バックエンドがあり、呼び出しごとに json 応答を提供します。

アプリケーションは、(既に述べたように) Marionette アプリケーションを使用して定義されます。

PlugUI.js: var PlugUI = new Backbone.Marionette.Application();

PlugUI.addRegions({
//  adminBarRegion: "#adminbar",
  contentRegion: "#content"
});

PlugUI.bind("routing:started", function(options){
  Backbone.history.start();
  PlugUI.Navigation.showNavigation();
});

Backbone.Marionette.TemplateCache.prototype.loadTemplate = function(templateId, callback){
  ...
});
}

ですから、これはかなり標準的なものだと思います。次に、次のように、いくつかのかなり標準的なコンテンツ (モデル、ビュー、およびルーター メソッドを意味する) を「コントローラー」に提供します。

PlugUI.module("Status", function(Status, PlugUI, Backbone, Marionette, $, _) {
  // define the model
  Status.Status = Backbone.Model.extend({
    defaults: {
       ...
    },
    urlRoot: function() {
      return '/api/status';
    },

    fetchStatus: function() {
      var status = new Status.Status();
      status.fetch({
        success: function(data, response){
          Status.showStatus(response);
        }
      })
    }
  });

  Status.showStatus = function(model){
  var status = new Status.Status(model);
  var statusView = new Status.StatusView({
    model: status
  });

  PlugUI.layout.main.show(statusView);
  // add trigger, so that navbar is shown ;-)
  PlugUI.vent.trigger("navbar:show", "status-icon");
}

Status.StatusView = Backbone.Marionette.ItemView.extend({
  tagName: "div",
  className: "one-third column statusbox",
  template: "#status"
});

Status.Router = Backbone.Marionette.AppRouter.extend({
  appRoutes: {
    "status": "showUniqueStatus"
  }
});  

PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})
})

この 1 つのコントローラーのビューを直接トリガーする限り、これは非常にうまく機能します。同じようなものを別のコントローラーに追加して、ルーター経由で show メソッドをトリガーしても、基本的には何も起こりません。新しいコントローラーでビューを表示するために、フロントエンドにイベントを追加しましたが、これは機能しますが、ルーター経由で機能するはずだと思いました。私は何か間違ったことを理解しましたか?

完全な (動作していない) ソース コードについては、github プロジェクトを参照してください。

どんな助けでも本当に感謝しています。

4

3 に答える 3

2

本当に長い遅延で申し訳ありませんが...

提案された解決策(初期化子の移動)は、解決策の一部です。さらに、イベント「routing:started」をトリガーすると、このイベントは「Backbone.history.start();」を起動しました。このメソッドの呼び出しを「initialize:after」に移動しました。これで、すべてが完全に機能します。

PlugUI.bind("initialize:after", function(optionns) {
  console.log("initialize:after");
  Backbone.history.start();
});
于 2012-09-30T15:42:12.923 に答える
2

完全にはわかりませんが、問題は初期化子にあると思います (最新の Backbone.Marionette バージョンを使用していると仮定します):


PlugUI.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: PlugUI.Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})

Status.addInitializer代わりに試す


Status.addInitializer(function(options){
  Status.router = new Status.Router({
    controller: Status
  }); 

  PlugUI.vent.trigger("routing:started");    
})
于 2012-08-07T21:11:07.670 に答える
0

これはかなり遅れていると思いますが、次のようにバックボーン履歴を開始してみてください

PlugUI.on("before:start", function(options) {
   console.log("Starting history before start");
   Backbone.history.start();};

私はこれで十分な時間を無駄にしました。

PlugUI.on("start") は機能しませんが、「before:start」では機能します

于 2014-08-30T23:07:06.360 に答える