1

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

这是我的路线文件顶部的一个片段。

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

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

我的问题是,假设我想在多个屏幕上显示相同的全局事件;比如说,所有的“目录”屏幕。我一直在做一些奇怪的,公认的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 方面的经验越来越丰富,但我显然还有一些东西要学。

4

1 回答 1

1

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

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

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

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

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
于 2013-01-31T22:16:17.533 回答