如何确保Iron-Router的函数运行之前?

时间:2013-11-13 21:04:50

标签: meteor rendering iron-router

我正在使用Iron-Router和Meteor。当用户转到/ foo /:routeID时,foo在到达之前加载是很重要的。有时它不会及时加载,页面将呈现不稳定。当这些时间发生时,我无法弄清楚一种可辨别的模式。

如果我更改它以使页面在加载foo后重新渲染,那么会有明显的更新。我宁愿把它当作s.t.加载foo对象时页面呈现。我怎么做到这一点?我目前的路线如下。

this.route('foo', {
    path:'/foo/:routeID',
    layoutTemplate:'base',
    before: function() {
        foo = Foos.findOne({routeID:this.params.routeID});
        console.log('before');
        console.log(foo);
        Session.set('foo', foo);
    }

1 个答案:

答案 0 :(得分:1)

当您使用IronRouter时,Before将始终运行,但它不会始终阻止,因此如果某些事情需要一段时间,您的其他代码仍可能过早运行。

为了确保您的集合已加载,您需要在其上调用.wait()以强制Meteor / IronRouter在加载集合之前不尝试显示模板或运行其他相关代码。

这样的事情应该有效:

this.route('foo', {
path:'/foo/:routeID',
layoutTemplate:'base',
before: function() {
    this.subscribe('foos').wait();
    foo = Foos.findOne({routeID:this.params.routeID});
    console.log('before');
    console.log(foo);
    Session.set('foo', foo);
}

你需要确保你已经定义了publish函数(并且如果你还没有关闭自动发布)foo。

修改 此外,为了安全起见并防止所有用户/路由下载每个Foo然后在客户端进行过滤,您可以使用带有参数的发布/订阅功能来确保您没有下载整个每次点击页面时收集。

this.subscribe('foos', this.params.routeID).wait();