【发布时间】:2012-02-08 08:52:52
【问题描述】:
我今天大部分时间都在考虑这个问题。我正在开发两个应用程序——一个由 ExtJS4 驱动的应用程序和一个由 Backbone 驱动的应用程序。在这两种情况下,它们都是单页应用程序——用户不会离开页面,因此他们可以“暂停”他们正在做的事情或正在查看的内容以对另一个兴趣点做出反应。
在 ExtJS4 案例中,我使用了一种自制的路由系统,在该系统中,当应用程序启动时,它会询问其所有控制器“您对哪些路由做出响应?”。据我所知,这有几个优点 -
- 路由是在控制器上定义的,因此移除控制器,无需更新配置文件。
- 该应用程序更容易添加控制器,而且似乎更加模块化。
- 更改路由或参数不需要更改应用程序,只需要更改控制器即可(由于控制器在内部处理路由,因此受到了很好的限制)。
问题是,到目前为止,我还没有看到任何框架或应用程序可以做这样的事情。我不知道为什么——这是一种可怕的做法,以至于它没有进入生产环境吗?还是我只是没有从事使用它的项目..?基于 Backbone 的应用程序基于一些疯狂的 hackjob 代码,所以今天我使用相同的基本格式重写了大部分代码。它极大地降低了代码的复杂性,让我怀疑这是否是“好得令人难以置信的情况”。
伪代码:
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();
所以,我想问题是:“这是不好的做法,为什么?如果不是,为什么不在其他地方使用?设置其他语言太难或太乱了?你能预见到一些事情会发生吗?以后会咬我吗?”
谢谢。
编辑: 昨晚我意识到了一些缺点 -
- 注册所有可能的路由需要启动所有控制器。但是,即使那样(特别是对于 JS),也有一个简单的方法可以解决这个问题。
- 如果我想更改路由,我必须找到管理该特定路由的控制器。当然,如果我的路线命名得当,那应该不是问题。
- 很难追踪别名路线 - 即 /marketing_page 确实是 /pages/3.. 但这不是应用程序的工作方式,因此在这种情况下,这是一个有争议的问题。
【问题讨论】:
标签: javascript routes