我有一个模板,可以根据路由参数加载帖子。如果我在*.com/feed/
它将加载所有未回复其他帖子的帖子。如果我在*.com/feed/postId
,它将加载指定的帖子及其所有回复。回复只是带有指向其父级的指针的常规帖子。
我有一个帮助者返回postId
singlePost: function () {
console.log('!');
return Route.current().params.postId;
}
我用它来修改我的页面布局
{{#if singlePost}}
{{#with onePost}}
{{> post}}
{{#each replies}}
{{> post}}
{{/each}}
{{/with}}
{{else}}
{{#each posts}}
{{> post}}
{{/each}}
{{/if}}
首次加载时,每次刷新时都能正常运行。但如果我在显示所有帖子的主要提要上,并且我点击一个进入该帖子的页面,Meteor会携带一些旧帖子(通常是三个或四个)。这让我有了
random post
random post
post I want
reply to post
random post
现在,如果我回击,我将返回主要饲料,但我再次带来了帖子。这次我带来了之前的一些随机的加上我试图看到的帖子,也许还有一些回复。这些是冻结的,而不是被动的,不是更新的,手动删除数据库中的所有帖子将删除常规帖子,但不删除冻结的帖子。如果我点击帖子并反复回击,帖子数量会呈指数级增长。
刷新会立即清除它们,但同样的过程会很快重新开始。
如果我将页面布局更改为不具有单个帖子视图
{{#unless singlePost}}
{{#each posts}}
{{> post}}
{{/each}}
{{/unless}}
这里的理论是,只有当用户在主要饲料上时才会看到帖子。点击帖子直接查看,Meteor仍会发帖。来回几次,我有几个冷冻的帖子和我一起旅行。
这使我假设singlePost
没有被动,因为#unless
永远不会失效,但是控制台日志会在每次页面更改时成功跟踪。如果我将控制台设置为记录帮助程序返回的确切内容的正确性,则会在正确的时刻显示真和假 - 流量忽略此信息并显示帖子。
如果有人对此处发生的事情有任何了解,我们将不胜感激
onePost: function() {
var post = Router.current().params.post;
return post ? Threads.findOne({ //Findone so I can use #with instead of #each
_id: post
}, {
sort: {
timestamp: -1
}
}) : false;
},
replies: function() { //Replies are infinitely nested
var tier = this.ancestors ? this.ancestors.length : 0;
var size = tier + 1; //A direct child's list of ancestors
var query = { //will be one item longer than its parent
ancestors: {
$size: size
}
}; //And the final item will be its parent
query['ancestors.' + tier] = this._id;
return Threads.find(query, {
sort: {
timestamp: 1
}
});
},
posts: function() { //Posts that are not replies
var post = Router.current().params.post;
return post ? false : Threads.find({
ancestors: {
$exists: false
}
}, {
sort: {
timestamp: -1
}
});
}