流星:onhashchange不会开火

时间:2015-03-18 07:19:54

标签: javascript meteor

我有一种奇怪的情况。似乎Meteor with Iron :: Router正在覆盖onhashchange事件的某个地方,但是我没有成功跟踪它。

基本上,如果我听那个事件,它永远不会因为某些原因而开火。我在各处查看和搜索,甚至找不到Meteor代码库中对onhashchange的任何引用。

if(Meteor.isClient) {
  window.addEventListener('hashchange', function() {
    alert('changed');
  });
}

这永远不会激发 - 尽管事件已正确注册。在普通的香草中它工作得很好..所以我认为它在某处被覆盖..任何见解都将受到赞赏。

http://jsfiddle.net/L2dj3o7n/

哦,还有一件事,这就是我的网址现在用于测试的方式:

http://localhost:3000/#/workflow
http://localhost:3000/#/settings/account
http://localhost:3000/#/group/add

1 个答案:

答案 0 :(得分:0)

来自Iron Router guide的路由器参数部分:

  

如果网址中有查询字符串或哈希片段,则可以访问   那些使用this.params对象的查询和哈希属性的那些。

// given the url: "/post/5?q=s#hashFrag" 
Router.route('/post/:_id',
function () {   
    var id = this.params._id;   
    var query = this.params.query; // query.q -> "s"   
    var hash = this.params.hash; // "hashFrag" 
});
     

注意:如果要在哈希更改时重新运行函数,则可以执行此操作   这样:

// get a handle for the controller. 
// in a template helper this would be 
// var controller = Iron.controller(); 
var controller = this;

// reactive getParams method which will invalidate the comp if any part of the params change 
// including the hash. 
var params = controller.getParams();

getParams是被动的,因此如果哈希更新,则getParams()调用应该无效并为您正在使用它的任何内容触发新计算。例如,如果你想根据哈希值动态渲染模板,你应该可以做这样的事情...... HTML:

<template name='myTemplate'>
  {{> Template.dynamic template=getTemplateFromHash}}
</template>

JS:

Template.myTemplate.helpers({
  getTemplateFromHash: function() { 
    var hash = Iron.controller().getParams().hash;
    ... // do whatever you need to do with the hash to figure out the template to render
  }
});