【问题标题】:Router.go() does not trigger renderedRouter.go() 不会触发渲染
【发布时间】:2014-09-17 01:04:14
【问题描述】:

假设我有一个名为“home”的模板:

<template name="home">
  <h1>Hello, world!</h1>
</template>

我给它一个渲染事件:

Template.home.rendered = function () {
  alert('Hello!');
};

还有一条“回家”路线:

Router.map(function() {
  this.route('home', {
    path: '/'
  });
});

现在,当我第一次加载页面时,“你好!”警报正确出现。但是,无论我在控制台中输入多少Router.go('home'),来自rendered 回调的警报都不再触发......

我将如何编写每次有Router.go()时触发的东西,但是在模板完全呈现之后(特别是可能会有所不同的集合列表),因为我想应用jquery每次都要一组新的集合元素?

【问题讨论】:

  • 您是否在拨打Router.go('home') 而已经在home 路由上?
  • 这是非常正确的先生。
  • 这就是它没有被重新渲染的原因,尝试创建另一个路由,然后在它们之间切换,你应该会看到它的工作。
  • 遗憾的是,这是我找到的唯一方法,我找不到“刷新”方法...我是否应该对仅重定向回我的虚拟路由执行 Router.go()主页模板?这听起来像是一个可怕的黑客攻击。
  • 至于你的第二个问题,看看 Iron-Router 中的 after hooks:github.com/EventedMind/iron-router/blob/devel/…

标签: collections meteor rendering iron-router


【解决方案1】:

如果您只需要在元素集合上应用 jquery,那么使用 Meteor.defer() 可能会更好。 snippet explaining the usage

无论如何,我发现没有办法在不改变路线的情况下触发 .rendered() 函数。 当路由有参数并且您使用 Router.go() 重定向到新参数(例如 /page/2)时,这会发生。 我用一个可怕的 hack 解决了这个问题,比如:

<span style="display:none;">{{fakeHelper}}</span>

然后在 fakeHelper 辅助函数中插入代码。 太糟糕了,但在那种情况下它对我有用。

【讨论】:

  • 是的! Meteor.defer() 成功了。它在调用回调之前等待 DOM 上更新的任何内容,因此我在每个“视图更改”操作之后使用它,并且在其中调用的 jQuery 每次都正确运行。原来我的问题更多是关于不断变化的反应内容,而不是路由器问题......非常感谢 D 先生的宝贵帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 2021-12-15
  • 1970-01-01
  • 2015-07-21
  • 2021-10-28
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多