多个路由骨干上的相同事件

时间:2013-01-31 20:03:58

标签: javascript backbone.js methods routes

我看到一些帖子引用了类似的问题,但不完全相同。

以下是路线文件顶部的摘录。

我想知道我正在使用的方法是否适用于在每条路线上调用全局事件。我正在使用的事件是相当标准的简单事件,例如清除#items容器。

如您所见,我正在构造函数中调用“all”事件,然后指向routes文件中定义的几个方法。

我的问题是,我想要在几个屏幕上播放相同的全球事件;比如说,所有的“目录”屏幕。我一直在做一些奇怪的,不可否认的hacky技巧来获得ou

@routeName = route.split(":")[1]

# only substantiate the dropdown on User Catalog screen.
if @routeName is "catalogScreen" or @routeName is "catalogPDFScreen"

我相信你可以想象,这不是理想的,也不是特别干净。我只是想找到干扰我的路由器文件以捕获所有这些全局事件的方法,这是我能想到的最好的。

routes:
  ""                                        : "homeScreen"
  "catalogs"                                : "catalogsScreen"
  "catalogs/:id"                            : "catalogScreen"
  "catalogs/:id/page/:page_id"              : "catalogScreen"
  "catalogs/:id/pdf"                        : "catalogPDFScreen"
  "catalogs/:id/pdf/page/:page_id"          : "catalogPDFScreen"
  "catalogs/:id/category/:category_id"      : "categoryScreen"
  "departments/:id"                         : "departmentScreen"
  "notifications"                           : "notificationsScreen"
  "settings"                                : "settingsScreen"
  "products/:id"                            : "productScreen"
  "catalog/:catalog_id/search/:search_query": "searchCatalogScreen"
  "search/:search_query"                    : "searchScreen"
  "login"                                   : "loginScreen"
  "members/:member_id/catalogs/:catalog_id" : "userCatalogScreen"
  "members/:member_id"                      : "profileScreen"
  ":user_name/:catalog_name"                : ""

#extends router class to allow storing of routes for a history
constructor: (options) ->
  @on "all", @storeRoute
  @on "all", @clearAlerts
  @on "all", @clearScroll
  @on "all", @setSearch
  @on "all", @setNav

提前感谢任何人对此的帮助!我在Backbone方面的经验越来越丰富,但我显然有一些东西需要学习。

1 个答案:

答案 0 :(得分:1)

就路由表本身的DRY-ness而言,您可以利用对可选router parameters的支持来组合共享相同根但不同参数的路由:

"catalogs/:id(/page/:page_id)"

至于将常用操作附加到某些路由,但不是全部,有很多选项。我认为最干净的方法是将路由器分成多个路由器:CatalogRouter用于catalogs*网址等。只有当路由器自然地映射到您的应用程序结构时才有意义。

如果您不想拆分路由器,另一种方法是触发路由的自定义事件

catalogScreen:(id, pageId) =>
  #normal route handling here
  @trigger "routed:catalog"

其他地方:

@on "routed:catalog", @foo
@on "routed:catalog", @bar
@on "routed:catalog", @baz

或者如果你的事件处理程序不需要路由参数,你可以使用下划线的compose来获取一些语法糖。

@on "routed:catalog", _.compose @foo, @bar, @baz