2012-08-22 63 views
1

我相信在数据驱动的编程范例中,路由器和视图应该彼此隔离,并且它们只能通过它们都订阅的模型更改来相互通信。视图和路由器之间的骨干关系

但是,网上的各种教程都以不同的方式做到这一点。我看到了在路由器的initialize方法内实例化视图的代码,因此给路由器一种访问视图的方法。我还看到了将路由器传递给视图的代码,以便视图可以监听路由器路由事件上的更改。

我不相信任何一种方法都是正确的,因为它打破了关注的分离。由于我是Backbone的新手,有更多经验丰富且知识渊博的人可以证实吗?

回答

0

我没有看到使用路由器实例化视图的任何问题,实际上是我用来工作的方式。路由器检测到新的URL和分离任何未使用查看和实例化请求的。

将路由器引用传递给视图可能更加丑陋,不要说太多的努力来保持引用在视图和子视图之间传播。

但在另一方面视图必须能够将信号发送到路由器来改变导航所以我也去了简单的方法,使路由器在我的应用程序的所有元素全局可见,我可以打电话App.router.navigate()从任何视图,而不必记得明确传递参考。这个决定可以得到捍卫,因为在任何Backbone应用程序中只允许有一个路由器实例。

+0

谢谢!几点意见: 1)而不是App.router.navigate,你可以使用Backbone.history.navigate。从Backbone源代码,我相信这是使Backbone.history成为全局实例的意图。 –

+0

2)我相信在我看到的大多数Backbone代码中,让路由器实例化视图是最常见的方法。但是,我认为这是不理想的,因为它不必要地将观点与路由器结合在一起。 –

+0

3)我已经非常成功地让视图和路由器通过模型中的变化进行通信,并且这是一种将两者完全分离的方法。我认为这是主要的方式,但我在实践中看不到足够的,因此这个问题。 –

0

在一些项目中,我使用了全局事件调度程序,它将路由事件传递给视图。

window.Dispatcher = _.extend({}, Backbone.Events); 

在路由器可以绑定到'all'事件捕获route:*事件:

initialize: function() { 
    this.bind('all', this.onRoute); 
}, 
onRoute: function(route) { 
     Dispatcher.trigger(route); 
} 

在你的意见,你可以绑定到调度事件和应对路线的变化:

initialize: function() { 
    Dispatcher.on('route:index', this.onIndex, this) 
} 

这与在路由更改时更改模型类似,但我觉得这更容易管理,并且不需要将路由器传递给v IEWS。不知道这是否是正确的方法,但是Backbone也可以让你以许多不同的方式做事。

+0

我也在想这个,但是你只是将通信依赖从_Router_移动到新的_Dispatcher_元素。我喜欢_EventAggregator_模式,但在这种情况下,我会将它看作另一个不必要的图层。另一方面,_who首先实例化视图?_ – fguillen