javascript - 多条路由 Backbone 上的相同事件

标签 javascript backbone.js methods routes

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

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

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

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

我的问题是,假设我想在多个屏幕上显示相同的全局事件;例如,所有“目录”屏幕。我一直在做一些奇怪的、不可否认的黑客技巧来获得 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 的使用经验越来越丰富,但显然我还有一些东西需要学习。

最佳答案

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

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

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

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

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

关于javascript - 多条路由 Backbone 上的相同事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14634153/

相关文章:

javascript - 将 Bootstrap Grid 用于 Tile 系统但不使用 JS

javascript - 为什么我应该使用backbone.js或spine.js

javascript - Backbone.js 新手,如何从 html 按钮和链接调用函数

java - 在另一种方法中更改 boolean 值?

java - 如何在一种方法中调用另一种方法中的整数?

java - 调用start方法时,是否需要在java的run方法中同步方法?

javascript - 移动点击下拉菜单不起作用?

javascript - 如何为未知数量的复选框实现全选按钮

javascript - 等到 Jquery 中的 await/async 返回

javascript - 是否可以只重新渲染模板的一部分