template.data._id在Meteor中做了什么?

时间:2013-11-12 19:16:54

标签: javascript mongodb templates meteor

初级流星/ JS问题:

在Meteor中关联对象时,我看到了一小段我不理解的代码。例如,发布相关评论。

var $body = $(e.target).find('[name=body]');
var comment = {
  body: $body.val(),
  postId: template.data._id
};

因此,获取评论的内容,将其放在变量“comment”中,并创建一个postId进入此评论,以便您知道评论所属的帖子。使用*'template.data._id'*

调用此postId

我的问题是:

  1. 所以你调用模板,然后你不想调用模板名称吗?不是数据?数据来自哪里?
  2. 除此之外,您调用数据......然后._id,“数据”还有其他选项吗? IE

      

    template.data。(可选)

  3. 这对我不起作用,哈哈,* console.log(template.data._id); *未定义。所以它并没有像宣传的那样抓取对象ID。我确定我搞砸了。

  4. 如果您需要更多上下文,这是周围的代码: https://github.com/DiscoverMeteor/Microscope/blob/master/client/views/comments/comment_submit.js

3 个答案:

答案 0 :(得分:3)

从最简单的第一个开始,在你的第3点,它应该是:

console.log(template.data._id);

关于第1点和第2点,需要注意的关键思想是在Template.commentSubmit.events({})内调用您的代码。在此对象(“{}”)内部,您正在处理文档中的模板实例,包括传递给该实例的任何数据。在另一个模板中,您将收到不同的数据,因此template.data将包含不同的键和值。您可以在此处的文档http://docs.meteor.com/#template_inst中查看更多信息。

因此,在回答您的问题时,您可以调用“数据”而不是模板名称的原因是模板名称已由Template.commentSubmit提供。请注意,在事件({})内部,“this”通常等同于“template.data”。所以

console.log(template.data._id);

通常相当于

console.log(this._id);

您可以访问数据的属性将始终根据模板收到的实例而有所不同。例如,如果template.data由{_id:1,name:“x”,location:“y”}组成,则可以通过调用键来检索这些值,例如: “template.data.name”或“template.data._id”等。在您的示例中,您将postID设置为template.data._id是正确的。

到达模板的数据来自您的Meteor.subscriptions。希望这会有所帮助。

答案 1 :(得分:0)

模板有一个数据上下文。当您使用{{#each}}块时,您正在迭代数据,在这种情况下是帖子。

因此,使用template.data检索模板的数据上下文。它将引用评论表所在的帖子。因此template.data._id相当于此post._id(其中帖子是您评论的帖子)。

事情是我认为这是从流星中删除的。它有几个版本。我不确定这一点,但这就是我的想法。我原以为正确的代码应该是this._id。其中this最终成为表单的数据上下文(也将是帖子)。

如果您将其更改,是否可以检查是否会为您提供undefined

答案 2 :(得分:0)

模板的.events方法接收事件映射:

http://docs.meteor.com/#eventmaps

每个事件的回调(在本例中为“提交表​​单”)可以采用两个参数。第一个'e'是javascript事件对象,第二个'template'是事件发生的模板的实例。该模板实例有一堆实用方法/属性(参见http://docs.meteor.com/#template_inst),其中一个是.data(参见http://docs.meteor.com/#template_data)。该.data属性返回模板绑定的数据(在显微镜示例中,它看起来像是绑定到注释对象),该对象(在本例中)具有_id属性。

请注意,'模板'(小T)与模板(大T)不同。