【问题标题】:What does template.data._id do in Meteor?流星中的 template.data._id 有什么作用?
【发布时间】:2013-11-25 02:52:58
【问题描述】:

流星初学者/JS问题:

在 Meteor 中关联对象时,我看到一小行我不理解的代码。例如,与关联的 cmets 一起发布。

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

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

我的问题是:

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

    template.data.(选项)

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

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

【问题讨论】:

    标签: javascript mongodb templates meteor


    【解决方案1】:

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

    因此使用template.data 检索模板的数据上下文。它将指评论表单所在的帖子。所以template.data._id 等同于post._id(其中 post 是您正在评论的帖子)。

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

    如果你把它改了,你能检查一下它是否给你undefined

    【讨论】:

    • 感谢 Tarang,我确实尝试了 this._id,我相信我得到了相同的未定义。我今晚会再试一次,我会回复你的。
    • 是的,它只是说 undefined..Idk 发生了什么。
    【解决方案2】:

    模板的 .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)不同。

    【讨论】:

      【解决方案3】:

      从最简单的开始,在您的第 3 点下,它应该是:

      console.log(template.data._id);
      

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

      所以在回答您的问题时,您可以调用“数据”而不是模板名称的原因是模板名称已由 Template.commentSubmit 提供。请注意,在 events({}) 内部,“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。希望这会有所帮助。

      【讨论】:

      • 所以你说模板是一个对象。当你有嵌套模板时呢? IE,一个帖子模板,然后你在里面调用评论模板。 template.data._id 正在尝试获取父模板 ID,但它位于子模板中。父母 ID 是否总是覆盖孩子?还是基于路线?
      • Template.name.events({}) 内部没有直接遍历父模板的方法,因此数据将是“子”数据。但是您可以使用 handlebars {{#with }} 命令更改模板的数据上下文。例如,如果你有 使评论的数据上下文成为父帖子。不确定这是否正是您的案例的设置方式,但它应该提供解决方案的一种模式。
      猜你喜欢
      • 2014-04-21
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 2014-04-24
      • 2019-09-19
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多