我有posts
的数据库,并且所有数据库都有bollean flagged
我有一个模板和导航像(阅读,不读)。
问题是我看到所有帖子(当我必须看到标记为false或标记为true的帖子时),我不明白为什么,我认为发布/订阅中的问题
Router.configure({
layoutTemplate: 'layout',
loadingTemplate: 'loading',
});
AllPostsController = RouteController.extend({
template: 'timeTable',
waitOn: function() {
return Meteor.subscribe('allPosts');
}
});
readPostController = AllPostsController.extend({
waitOn: function() {
return Meteor.subscribe('readPosts');
}
});
dontreaderPostController = AllPostsController.extend({
waitOn: function() {
return Meteor.subscribe('dontreadPosts');
}
});
Router.map(function() {
this.route('timeTable', {path: '/',
controller: AllPostsController
});
this.route('readPosts', {path: '/read',
controller: readPostsController
});
this.route('dontreaderPosts', {
path: '/dontreader',
controller: dontreaderPostController
});
});
Meteor.publish('allPosts', function(){
return Posts.find({},{ sort: { createdAt: -1 }});
});
Meteor.publish('readPosts', function(){
return Posts.find({read:true},{ sort: { createdAt: -1 }});
});
Meteor.publish('dontreadPosts', function(){
return Posts.find({read:false},{ sort: { createdAt: -1 }});
});
如果有人需要更多代码,请问我
任何人帮助
编辑: David为常规任务解决了问题。我在模板助手中有特定return Posts.find(...)
的主要问题。
<template name="timeTable">
{{#if posts_exist_week}}
{{> table posts=week}}
{{/if}}
{{#if posts_exist_month}}
{{> table posts=month}}
{{/if}}
</template>
<template name="table">
<table class="main-table table">
{{#each posts}}
{{> post}}
{{/each}}
</table>
</template>
你解决了我的问题如果我没有模板timeTable
(显示上周和月份的帖子)因为这里模板助手
Template.timeTable.helpers({
week: function() {
//...
return Posts.find({createdAt: {$gte: weekstart, $lt: yesterday}},{ sort: { createdAt: -1 }}); //return posts that was created in this week
},
month: function() {
//...
return Posts.find({createdAt: {$gte: monthstart, $lte: weekstart}},{ sort: { createdAt: -1 }});
}
});
现在你看,如果我选择你的决定(大卫),我会 2 !! 返回
首先 - 在路由器中 第二个 - 在模板助手
答案 0 :(得分:0)
我在本地重新创建了这个,发现extend
导致父控制器的waitOn
运行。因此,无论何时您转到/read
路线,它都会实际激活两个订阅,并且您最终会获得客户端上的所有文档。一个简单的解决方法是重构控制器,如下所示:
PostController = RouteController.extend({
template: 'timeTable'
});
AllPostsController = PostController.extend({
waitOn: function() {
return Meteor.subscribe('allPosts');
}
});
readPostController = PostController.extend({
waitOn: function() {
return Meteor.subscribe('readPosts');
}
});
dontreaderPostController = PostController.extend({
waitOn: function() {
return Meteor.subscribe('dontreadPosts');
}
});
话虽如此,您并不想以额外订阅恰好在其中运行时中断的方式构建您的应用。我会重写控制器,只选择与它们相关的文档。例如:
dontreaderPostController = PostController.extend({
waitOn: function() {
return Meteor.subscribe('dontreadPosts');
},
data: {selector: {read: false}}
});
现在你的帮助者可以像这样使用selector
:
Template.timeTable.helpers({
week: function() {
var selector = _.clone(this.selector || {});
selector.createdAt = {$gte: weekstart, $lt: yesterday};
return Posts.find(selector, {sort: {createdAt: -1}});
}
});
另请注意,在发布函数中排序可能没用 - 请参阅http://home.arcor.de/martin.honnen/xslt/test2015072101.html。