我现在只是从伟大的Discover Meteor书中学习Meteor,我很难理解Router.go()的功能,我认为这可能是其他初学者可以使用的答案
上下文:下面的代码执行了它应该做的事情 - 它从postSubmit表单中获取url和title值(表单中未包含的代码)并使用它来创建一篇新帖子。然后,它使用Router.go()
将用户带到帖子/:_ id 网址的postPage
模板,显示新创建的帖子的信息。这段代码都有效。
我的问题是:我希望您拨打Router.go()
时,以及传递“postPage”'模板,您需要传递的内容,因为第二个参数是{_id: post._id}
形式的帖子 id 元素(这也有效,我已尝试过),因为这是什么路线需要。那么为什么我传递post
var(包括网址和标题)而不是ID?
这是我的代码:
//post_submit.js
Template.postSubmit.events({ 'submit form': function(e) {
e.preventDefault();
var post = {
url: $(e.target).find('[name=url]').val(),
title: $(e.target).find('[name=title]').val()
};
post._id = Posts.insert(post);
//THE 'post' PARAMETER HERE INSTEAD OF '{_id: post._id}' IS WHAT I'M QUESTIONING
Router.go('postPage', post);
}
});
路由器的代码:
//Route for the postPage template
Router.route('/posts/:_id',
{name: 'postPage',
data: function(){ return Posts.findOne(this.params._id); }
});
答案 0 :(得分:1)
好问题 - 我第一次看到它时也发现这令人困惑。这是一个关于正在发生的事情的草图:
/posts/:_id
并确定应该传递一个包含_id
字段的上下文对象。Router.go
字段的上下文对象调用_id
。_id
的值复制到this.params
。因为路由器了解哪些字段是必需的(并且忽略了其余字段),所以如果你传入{_id: 'abc123'}
或{_id: 'abc123', title: 'hello', author: 'bob'}.
实际上并不重要。后者工作的事实只是一个方便,因此您不必将_id
提取到单独的对象中。