视图与路由器之间的骨干关系

时间:2012-08-22 18:36:54

标签: javascript backbone.js

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

然而,在线的各种教程都以不同的方式做到这一点。我见过在路由器初始化方法中实例化视图的代码,因此为路由器提供了访问视图的方法。我还看到了将路由器传递给视图的代码,以便视图可以监听路由器路由事件的变化。

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

2 个答案:

答案 0 :(得分:0)

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

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

但另一方面,视图必须能够向路由器发送信号以更改导航,因此我也采用简单的方法,使路由器在我的应用程序中的所有元素全局可见我可以从任何视图调用App.router.navigate(),而不必记住明确传递引用。可以保护此决策,因为在任何Backbone应用程序中只允许一个Router实例。

答案 1 :(得分:0)

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

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

在路由器中,您可以绑定到捕获'all'个事件的route:*事件:

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

在您的视图中,您可以绑定到Dispatcher事件并对路由更改做出反应:

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

这类似于在路由更改时更改模型,但我觉得这更容易管理,也不需要将路由器传递给视图。不确定这是否是正确的方法,但Backbone使您能够以多种不同的方式做事。

相关问题