首页 文章

了解Router.go()在Meteor中的工作原理

提问于
浏览
2

我现在只是从伟大的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 回答

  • 1

    好问题 - 我第一次看到它时也发现这令人困惑 . 这是一个正在发生的事情的草图:

    • 路由器解析 /posts/:_id 并确定应该传递一个包含 _id 字段的上下文对象 .

    • 使用包含 _id 字段的上下文对象调用 Router.go .

    • 路由器获取您的上下文对象并将 _id 的值复制到 this.params 中 .

    因为路由器了解哪些字段是必需的(并忽略其余字段),所以如果传入 {_id: 'abc123'}{_id: 'abc123', title: 'hello', author: 'bob'}. 实际上并不重要 . 后者工作的事实只是方便,因此您不必将 _id 提取到单独的对象 .

相关问题