在过去的两周里,我一直在学习主干和相关工具以及编写应用程序。我遇到了一个设计问题,想知道有哪些可用的解决方案,以及 Backbone 专家是否认为这是一个问题。
问题:我最终不得不将我所有的视图依赖项放在我的 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 生成的事件?必须有人创建并初始化它才能订阅事件聚合器,对吗?如果那个人是路由器,我是否需要在路由器中预先实例化所有视图?那没有意义。