16

据我了解,不同之处在于 an 上的事件的回调函数AppRouter应该存在于Controller,而不是同一个 Router 对象中。此外,此类 AppRouter 和控制器之间存在一对一的关系,我所有来自 Router 的代码现在都移至 Controller,我看不出有太多意义吗?那么为什么要使用它们呢?我肯定错过了什么?

4

2 回答 2

13

我看到它的方式是分离关注点:

  • 控制器实际完成工作(组装数据、实例化视图、在区域中显示它们等),并且可以更新 URL 以反映应用程序的状态(例如显示的内容)
  • 路由器只是根据地址栏中输入的 URL 触发控制器动作

所以基本上,如果您在应用程序的起始页面上,它应该可以正常工作而无需任何路由器:您的操作(例如单击菜单条目)只需触发各种控制器操作。

然后,您在路由器上添加“如果调用此 URL,则执行此控制器操作”。在您的控制器中,您可以使用 更新显示的 URL navigate("my_url_goes_here")。注意你没有通过trigger: true

有关更多信息,请查看 Derick 的博客文章http://lostechies.com/derickbailey/2011/08/28/dont-execute-a-backbone-js-route-handler-from-your-code/(“啊哈!”关于 Router.Navigate 的第二个参数的时刻”)

我还在我关于木偶的书的免费预览中更详细地介绍了这个主题。请参阅此处的第 32-46 页:http: //samples.leanpub.com/marionette-gentle-introduction-sample.pdf

于 2013-05-16T07:47:35.123 回答
1

我为路由器做了一些覆盖。目前以这种方式使用它(如卓别林): https ://gist.github.com/vermilion1/5525972

appRoutes : {
  // route : controller#method
  'search' : 'search#search'
  '*any'   : 'common#notFound'
},

initialize : function () {
  this.common = new Common();
  this.search = new Search();
}
于 2013-05-16T07:31:36.000 回答