如何使用Iron Router对URL散列更改做出反应?

时间:2015-10-02 16:56:19

标签: javascript url meteor url-routing iron-router

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

我已经在自定义route controller中重新实现了action方法,以便控制页面呈现,但是如果只有URL的哈希值发生变化,则不会调用此钩子(f.ex. due用户单击href="#about"的链接。我的控制器的相关部分如下所示:

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

因此,基本上我需要{URL}散列更改时调用action方法。

2 个答案:

答案 0 :(得分:3)

当哈希值发生变化时,可以重新运行路由处理程序,默认情况下它不会发生。要实现此目的,请在控制器上调用<asp:Content ID="body" ContentPlaceHolderID="body" runat="Server"> <div id="main"> <div class="container"> <div data-bind="template: { name: 'TillGroups' }"></div> </div> </div> <script id="TillGroups" type="text/html"> <label for="ddm">Till group:</label> <div id="ddm" class="btn-group"> <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"> <span class="caret"></span> </button> <ul class="dropdown-menu" role="menu" data-bind="foreach: StockCount.ReadTillGroupsValue"> <li><a role="menuitem" tabindex="-1" href="#" data-bind="text: Name"></a></li> </ul> </div> </script> </asp:Content> ,而不是仅访问getParams()

params

@UserController = RouteController.extend({ action: -> tabName = @getParams().hash @state.set("activeTab", tabName) @render("user") }) 是一个依赖于散列的反应计算,因此控制器的getParams方法本身就是被动的,它将在散列更改时重新运行。

答案 1 :(得分:1)

afaik iron-router不会对哈希变化作出反应。两个建议:

  1. 使用window.addEventListener()来捕获哈希更改
  2. 在标签本身上实施活动
  3. 选项(1)的优点是,如果有人共享链接,它将起作用。

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