我如何对 Iron Router 的 URL 哈希变化做出反应?

How can I react to URL hash change with Iron Router?

我如何才能对 Iron Router 的 URL 哈希变化做出反应?

我在自定义 route controller 中重新实现了 action 方法以控制页面呈现,但是如果只有 URL哈希更改(f.ex。由于用户单击 link 和 href="#about")。我的控制器的相关部分如下所示:

@UserController = RouteController.extend({
  action: ->
    tabName = @params.hash
    @state.set("activeTab", tabName)
    @render("user")
})

所以,基本上我需要 action 方法在 URL 哈希值发生变化时被调用。

afaik iron-router 不会对哈希更改做出反应。两条建议:

  1. 使用window.addEventListener()捕捉哈希变化
  2. 在选项卡本身上实施事件

选项 (1) 的优点是如果有人共享 link。

window.addEventListener("hashchange",function({
  console.log(document.location);
});

可以在哈希更改时重新运行 路由处理程序,只是默认情况下不会发生。为了实现这一点,请在控制器上调用 getParams() 而不是仅访问 params:

@UserController = RouteController.extend({
  action: ->
    tabName = @getParams().hash
    @state.set("activeTab", tabName)
    @render("user")
})

getParams 是一个依赖于哈希的反应式计算,因此由于控制器的 action 方法本身是反应式的,它将在哈希更改时重新获得 运行。