我现在只是从伟大的Discover Meteor书中学习Meteor,我很难理解Router.go()的功能,我认为这可能是其他初学者可以使用的答案 .
Context: 下面的代码执行了它应该做的事情 - 它从postSubmit表单中获取url和title值(表单中不包含的代码)并使用它来创建新帖子 . 然后它使用 Router.go()
将用户带到帖子/:_ id url的 postPage
模板,显示新创建的帖子的信息 . 这段代码都有效 .
My question is: 我希望当你调用 Router.go()
,以及传入'postPage'模板时,你需要传递的内容是第二个参数是 {_id: post._id}
形式的post id 元素(也可以,我试过了)因为这是路线所需要的 . 那么为什么我传入 post
var(包括url和title)而不是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); }
});
1 回答
好问题 - 我第一次看到它时也发现这令人困惑 . 这是一个正在发生的事情的草图:
路由器解析
/posts/:_id
并确定应该传递一个包含_id
字段的上下文对象 .使用包含
_id
字段的上下文对象调用Router.go
.路由器获取您的上下文对象并将
_id
的值复制到this.params
中 .因为路由器了解哪些字段是必需的(并忽略其余字段),所以如果传入
{_id: 'abc123'}
或{_id: 'abc123', title: 'hello', author: 'bob'}.
实际上并不重要 . 后者工作的事实只是方便,因此您不必将_id
提取到单独的对象 .