我正在使用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();