将 meteor 用于测试项目。在使用他们拥有的示例todo
应用时,无法弄清楚如何传递ID和搜索参数。
目前,我已经在我的铁路由器中了:
this.route('team', {
path: '/team/:_id',
onBeforeAction: function() {
this.todosHandle = Meteor.subscribe('todos', this.params._id);
// Then filter mongoDB to search for the text
}});
问题是,我还想传递一个可选的search
参数来搜索todos
。像path: '/team/:_id(/search/:search)?'
任何想法如何做到这一点?
答案 0 :(得分:2)
根据您的解释,您可能会仔细控制哪些文档实际发布到客户端,而不是发布所有文档并缩小客户端上的结果集。在这种情况下,我建议首先在服务器上定义一个出版物,如下所示:
Meteor.publish('todosByTeamIdAndSearch', function(todoTeamId, searchParameter) {
var todosCursor = null;
// Check for teamId and searchParameter existence and set
// todosCursor accordingly. If neither exist, return an empty
// cursor, while returning a subset of documents depending on
// parameter existence.
todosCursor = Todos.find({teamId: todoTeamId, ...}); // pass parameters accordingly
return todosCursor;
});
要了解有关定义更精细的出版物的更多信息,请查看this。
使用上面定义的出版物,您可以像这样设置路线:
Router.route('/team/:_id/search/:search', {
name: 'team',
waitOn: function() {
return Meteor.subscribe('todosByTeamIdAndSearch', this.params._id, this.params.search);
},
data: function() {
if(this.ready()) {
// Access your Todos collection like you normally would
var todos = Todos.find({});
}
}
});
从示例路由定义中可以看出,您可以在调用Router.route()
函数时直接定义路径的路径,并直接访问直接传入的参数。 waitOn
路由选项。由于已按照我的建议定义了发布,因此您只需将这些路由参数直接传递给Meteor.subscribe()
函数即可。然后,在data
路由选项中,一旦您检查了您的订阅已准备就绪,您可以像平常一样访问Todos
集合,如果您不需要这样做,则不会进一步缩小结果集
要了解有关如何配置路线的详情,请查看以下两个链接:Iron Router Route Parameters和Iron Router Route Options
答案 1 :(得分:1)
在客户端上,您只需在顶级代码中使用Meteor.subscribe('todos');
即可。 'todos'
这里没有引用Collection,它是一个任意字符串。订阅并不关心您的路线。
在服务器上,您将拥有这样的发布功能:
Meteor.publish('todos', function() {
if (!Meteor.userId()) return;
// return all todos (you could pass whatever query params)
return Todos({});
});
然后,在路线定义上:
Router.route('team', {
path: '/team/:_id',
data: function() {
if (this.params.query) { //if there's a query string
return Todos.find(/* according to the query string */).fetch();
else {
// return all the user's todos
return Todos.find({ uid: this.params._id }).fetch();
}
}
});