什么是Marionette AppRouter +控制器优于Backbone.Router?

时间:2013-05-16 07:16:52

标签: backbone.js marionette

根据我的理解,差异是AppRouter上的事件的回调函数应该存在于Controller中,而不是相同的Router对象。此外,AppRouter和App之间存在一对一的关系。控制器,我所有来自路由器的代码现在转移到控制器,我没有看到太多的意义吗?那么为什么要用呢?我肯定错过了什么?

2 个答案:

答案 0 :(得分:13)

我看待它的方式是分开关注点:

  • 控制器实际完成工作(组装数据,实例化视图,在区域中显示它们等),并且可以更新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/(“AHA!”关于Router.Navigate的第二个论点的时刻“)

我在Marionette的书的免费预览中也详细介绍了这个话题。请参见此处的第32-46页:http://samples.leanpub.com/marionette-gentle-introduction-sample.pdf

答案 1 :(得分: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();
}