(1)有点讨厌,它会到处泄露菜单的内部状态和结构。你最终会得到你的主要视图与你的菜单紧密结合,这会导致一个小泥球,而小泥球总是会变成大泥球。
我认为(2)是在正确的轨道上,但我会把它拉开一点。当前视图是应用程序状态的一部分,通过路由器切换视图是应用程序状态的变化。我们在 Backbone 中使用什么来跟踪状态和状态变化?我们使用模型和"change"
事件。如果您的应用程序状态有一个专用的全局模型:
AppState = Backbone.Model.extend({});
app_state = new AppState;
然后管理菜单的视图可以绑定到以下更改app_state
:
initialize: function() {
_.bindAll(this, 'change_current_view');
app_state.on('change:current_view', this.change_current_view);
}
并且事件处理程序可以处理<li>
s:
change_current_view: function() {
this.$('li').removeClass('current');
// This selector is, of course, just for illustration
this.$('#' + app_state.get('current_view')).addClass('current');
}
然后您的路由器可以交换视图并app_state.set({ current_view: '...'})
触发辅助操作。您甚至可以拥有一些东西,例如应用程序级别的视图,用于侦听"change:current_view"
并让该侦听器处理交换视图;这将简化您的路由器。这是一个快速演示,以帮助说明我在说什么:
http://jsfiddle.net/ambiguous/fr8sG/
这种“应用程序状态模型”方法通常非常有用;您可以轻松地向应用模型添加更多状态位、设置首选项编辑器等。您还将几乎免费获得持久性和应用程序初始化。