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

时间:2014-11-12 18:36:49

标签: meteor iron-router

我现在只是从伟大的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); }
});

1 个答案:

答案 0 :(得分:1)

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

  1. 路由器解析/posts/:_id并确定应该传递一个包含_id字段的上下文对象。
  2. 使用包含Router.go字段的上下文对象调用_id
  3. 路由器获取您的上下文对象并将_id的值复制到this.params
  4. 因为路由器了解哪些字段是必需的(并且忽略了其余字段),所以如果你传入{_id: 'abc123'}{_id: 'abc123', title: 'hello', author: 'bob'}.实际上并不重要。后者工作的事实只是一个方便,因此您不必将_id提取到单独的对象中。