我如何才能对使用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
方法。
答案 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不会对哈希变化作出反应。两个建议:
window.addEventListener()
来捕获哈希更改选项(1)的优点是,如果有人共享链接,它将起作用。
window.addEventListener("hashchange",function({
console.log(document.location);
});