0

我正在将 Iron-Router 与 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);
    }
4

1 回答 1

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);
}

您将需要确保为 foo 定义了发布功能(如果还没有,请关闭自动发布)。

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

this.subscribe('foos', this.params.routeID).wait();
于 2013-11-13T21:27:55.720 回答