在配置中声明的路由与由其控制器声明的路由

时间:2012-02-08 08:52:52

标签: javascript routes

我今天大部分时间都在考虑这个问题。我正在开发两个应用程序 - 一个ExtJS4驱动的应用程序和一个Backbone驱动的应用程序。在这两种情况下,它们都是单页应用程序 - 用户不会离开页面,因此他们可以“暂停”他们正在做的事情或者看到对另一个兴趣点做出反应。

在ExtJS4案例中,我使用的是一种本土路由系统,当应用程序启动时,它会询问所有控制器“你回应哪些路由?”。据我所知,这有几个优点 -

  1. 路由是在控制器上定义的,因此请删除控制器,无需更新配置文件。
  2. 应用程序更容易添加控制器,它似乎使其更加模块化。
  3. 更改路径或参数不需要更改应用程序,只需要控制器(并且由于控制器在内部处理路径,因此它非常受限制。)
  4. 问题是,到目前为止我还没有看到任何类似这样的框架或应用程序。我不知道为什么 - 这是一种如此可怕的做法,它不能进入​​生产环境吗?或者我只是没有在使用它的项目上工作..?基于Backbone的应用程序基于一些疯狂的hackjob代码,所以今天我用相同的基本格式重写了大部分内容。它极大地降低了代码的复杂性,让我想知道这是否“太好了,不是真实的情况”。

    Psuedo代码:

    controller
        routes: ['/bookmarks', '/bookmarks/(:action)/(:id)', '/bookmarks/(:action)']
        init: fn ()
           this.application.registerRoutes(this.routes, this);
           //other code to set up views and such
        routeHandler: fn (route, params)
           //tells the application to switch the visible stuff to this thing's 
           //main view, declared elsewhere
           this.application.showView(this.view) 
           switch(params.action)
              case "edit":
                 //some internal stuff to show the editing field for the ID passed..
                 this.showEditor();
                 this.loadRecordById(params.id)
              case "new":
                 //some internal stuff 
                 this.showEditor();
    

    所以,我想这个问题是:“这是不好的做法,为什么?如果没有,为什么不在其他地方使用?用其他语言设置太难或太乱了?你能预见到管道上有什么东西吗?以后会咬我的?“

    感谢。

    编辑: 昨晚我意识到了一些缺点 -

    1. 注册所有可能的路由需要启动所有控制器。但是,即便如此(特别是JS)也有一个简单的方法。
    2. 如果我想更改路线,我必须追踪管理该特定路线的控制器。当然,如果我的路线被恰当地命名,这应该不是问题。
    3. 跟踪别名路线很困难 - 即/ marketing_page真的是/ pages / 3 ..但这不是应用程序的工作方式,所以在这种情况下它有点没什么意义。

1 个答案:

答案 0 :(得分:2)

如果我想弄清楚用户如何到达/bookmarks/edit/5,我在哪里看?

通过你的方法,我必须找到控制器;谁知道你把它放在哪里。也许你正在遵循一个命名约定,或者可能不是。也许路线更像是/users/domenic/edit/preferences ---我不知道控制器会在那里。

采用传统方法,路由布线与控制器分离。如果我想知道路线的去向,那么只有一个地方可以看。我不会意外地为同一条路线添加两个响应,因为接线将紧挨着彼此---如果我将路线放在我的控制器上,我可能会花很多时间想知道“为什么不是我的动作被触发?“当它是因为某个其他控制器,在其他地方,已经在响应那条路线。

一般来说,这个想法是关注点分离。担心路由不是控制器的工作:控制器的工作是暴露操作,可以通过多种方式调用(路由就是其中之一)。然后,控制器的责任范围非常严格(单一责任原则:控制器只有一个变更轴)。路由问题可以分为专用路由表,它将路由与其实现分离,并使其易于更改(开放 - 关闭原则)。如果您以后想要更改/users/domenic/edit/preferences以使用preferences控制器而不是users控制器,则根本不需要编辑控制器:这应该是,因为它应该是他们不应该担心路由。