如何确保铁路由器的 Before 函数运行?



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

如果我更改它以使页面在加载 foo 后重新呈现,那么就会有一个明显的更新。我宁愿让它在加载 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);
    }

当你使用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);
}

您需要确保为 foo 定义了发布函数(如果尚未关闭自动发布),则需要关闭。

编辑:此外,为了安全起见,为了防止所有用户/路由下载每个Foo,然后在客户端进行过滤,您可以使用带有参数的发布/订阅函数来确保每次点击页面时都不会下载整个集合。

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

最新更新