1

初学者流星/JS问题:

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

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,“数据”还有其他选项吗?IE

    模板数据。(选项)

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

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

4

3 回答 3

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。希望这可以帮助。

于 2013-11-12T20:09:52.533 回答
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)不同。

于 2013-11-12T19:45:53.253 回答
0

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

因此 usingtemplate.data检索模板的数据上下文。它将指评论表单所在的帖子。template.data._id与此等效(其中postpost._id是您正在评论的帖子)。

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

undefined如果你改变它,你能检查一下它是否给你吗?

于 2013-11-12T19:42:41.750 回答