現在、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 プロジェクトを参照してください。
どんな助けでも本当に感謝しています。