この 2 週間は、アプリケーションの作成だけでなく、バックボーンと関連ツールの学習にも費やしました。設計上の問題で壁にぶつかりました。利用可能なソリューションの種類と、バックボーンの専門家がこれを問題と見なしているかどうかを知りたいです。
問題: すべてのビューの依存関係を router.js に配置する必要があり、それらがそれを回避する方法であるかどうかを判断できません。以下は、私の router.js のコードです。
// router.js
define([
'jquery',
'underscore',
'backbone',
'text',
'views/landing',
'views/dashboard',
],
function($, _, Backbone, t,LandingView,DashboardView){
var AppRouter = Backbone.Router.extend({
routes: {
// Define some URL routes
'': 'showLanding',
'projects': 'showProjects',
// Default
'*actions': 'defaultAction'
},
navigate_to: function(model){
alert("navigate_to");
},
showProjects: function() {},
showLanding: function() {},
});
var initialize = function() {
var app_router = new AppRouter;
Backbone.View.prototype.event_aggregator = _.extend({}, Backbone.Events);
// Extend the View class to include a navigation method goTo
Backbone.View.prototype.goTo = function (loc) {
app_router.navigate(loc, true);
};
app_router.on('route:showLanding', function(){
var landing = new LandingView();
});
app_router.on('route:showProjects', function(){
var dashboard=new DashboardView();
});
app_router.on('defaultAction', function(actions){
alert("No routes");
// We have no matching route, lets just log what the URL was
console.log('No route:', actions);
});
Backbone.history.start({pushState: true});
};
return {
initialize: initialize
};
});
router.js には、それぞれのテンプレートを取得するLandingViewおよびDashboardViewビューが含まれています。最初のルートは、ログイン テンプレートを持つ LandingView を読み込みます。ログイン後、router.js の goTo メソッドを呼び出して DashboardView() を生成します。これは機能しますが、少し醜いと感じます。しかし、LandingView() の内部から、またはルーターから直接 DashboardView() を参照せずに、LandingView から新しい DashboardView を生成する方法がわかりません。
router.js を介してこれを続けると、ルーターからすべてのビュー js ファイルを直接的または間接的にプルすることになります。ちょっと醜いですね!
Derick Baileys のイベント アグリゲーター パターンを見ましたが、DashboardView のインスタンスがまだ存在しない場合、DashboardView は LandingView によって生成されたイベントをどのようにサブスクライブするのかという問題に直面しました。イベントアグリゲーターにサブスクライブするには、誰かがそれを作成して初期化する必要がありますよね? その誰かがルーターである場合、すべてのビューをルーターで事前にインスタンス化する必要がありますか? それは意味がありません。