视图和路由器之间的主干关系

Backbone relationship between the view and the router

本文关键字:关系 之间 路由器 视图      更新时间:2023-09-26

我认为,在数据驱动的编程范式中,路由器和视图应该相互隔离,它们只有通过模型更改才能相互通信,它们都订阅了模型更改。

然而,网上的各种教程都有不同的做法。我看到了在路由器的initialize方法中实例化视图的代码,从而为路由器提供了访问视图的方法。我还看到了将路由器传递到视图的代码,这样视图就可以监听路由器路由事件的更改。

我认为这两种方法都不对,因为它打破了关注的分离。由于我是Backbone的新手,能有更有经验和知识的人来确认吗?

我认为使用路由器实例化视图没有任何问题,实际上这是我的工作方式。路由器检测到一个新的URL,并分离任何未使用的视图,实例化请求的URL。

将Router引用传递到视图可能会更难看,更不用说让引用在视图和子视图之间传递太多了。

但另一方面,视图必须能够向路由器发送信号以更改导航,因此我也采取了简单的方法,使路由器对我的应用程序中的所有元素都全局可见,并且我可以从任何视图调用App.router.navigate(),而无需记住显式传递引用。这一决定可以辩护,因为在任何主干应用程序中都只允许使用一个路由器实例。

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

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

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

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

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

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

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