我有两个模板,我想在同一页面上呈现。一个是列出最近项目的模板;另一个列出了$ text搜索结果的项目。
每个模板的数据来自单独的订阅。问题是,minimongo不支持$ text搜索,因此一旦返回订阅,我就不能使用$ text来限制客户端的结果。这是一个问题,因为两个订阅在客户端混合在一起,所以我的搜索结果和最近的项目结果看起来都很奇怪,因为它们都是从两个订阅中抽取的。
我正在尝试使用Iron Router来指定哪个模板订阅哪个发布。但是,我的代码不起作用。
在服务器上,文件app.js,两个单独的出版物:
if (Meteor.isServer) {
Meteor.publish("myitems", function () {
return Items.find();
});
Items._ensureIndex({
"itemName": "text",
//"tags" : "text"
});
Meteor.publish("search", function (searchValue) {
if (!this.userId) {
this.ready();
return;
}
return Items.find(
{
createdBy: this.userId,
$text: {$search: searchValue},
retired: {$ne: true}
},
{
fields: {
score: {$meta: "textScore"}
},
sort: {
score: {$meta: "textScore"}
}
}
);
});
}
客户端代码:
最近项目模板的帮助:
Template.myitems.helpers(
{
items: function () {
var d = new Date();
var currentUser = Meteor.userId();
return Items.find(
{
createdBy: currentUser,
createdAt: {
$gte: new Date(d.setDate(d.getDate() - 30))
}
},
{
sort: {
createdAt: -1
},
limit: 5
});
}
});
搜索结果模板的帮助:
Template.searchResults.helpers({ searchitems:function(){ if(Session.get(“searchValue”)){ return Items.find({ },{ sort:{“score”: - 1,“itemName”: - 1}, //限制:10 }); } else { // return Items.find({}); } } }); }
每个模板的onCreated订阅,单独:
Template.myitems.onCreated (function () {
Meteor.subscribe('myitems');
});
Template.searchResults.onCreated (function () {
Meteor.subscribe('search');
});
路由器控制器配置:是的你会看到它也尝试订阅,但无论如何它都会失败,因此没有重复订阅“myitems”
itemsController = RouteController.extend({
//waitOn: function() {
// return [
// Meteor.subscribe('myitems')
// ];
//},
//data: function() {
// //return { items : Items.find({}), item_id : this.params._id }
// return {items: Items.find()};
//},
action: function() {
this.render('items');
this.render('searchitems', {to: 'region1'});
this.render('myitems', {
to: 'region3',
waitOn: function() {
return [
Meteor.subscribe('myitems')
];
},
data: function(){
return {items: Items.find()};
}
});
}
});
上述铁路由器代码不会尝试订阅搜索出版物。它试图订阅最近的项目('myitems')发布,但不知何故返回的“项目”是空的。该问题不是由于发布中的任何错误设置,因为注释掉的代码有效:如果它被取消注释,那么“items”会返回并且不为空,即使我不使用onCreated来订阅它。
我的问题是:
上面的代码出了什么问题?我知道“铁路由器”的订阅“myitems”失败了。 “myitems”的订阅在“onCreate”中成功,但搜索结果也来自“myitems”,而不是仅从“searchResults”中提取。
假设我可以修复上面的代码,Iron Router就是解决原始问题的方法:搜索结果订阅和最近的项目订阅需要分开,尽管这两个模板要呈现在同一个网页?