模板与助手中的流星数据上下文

时间:2016-09-23 09:53:36

标签: templates meteor helpers

试图更好地了解数据上下文在Meteor中的工作原理,因为我无法弄清楚我面临的这个问题。 Haven在任何地方都找不到明确的答案。我有以下模板

<template name="list">
  {{#each listItem}}
    {{> listItemDetail}}
  {{/each}}
</template>

<template name="listItemDetail">
  <p>{{_id}} {{title}}</p>
  <p>{{idViaHelper}}</p>
</template>

在我的Javascript中我有

Template.list.helpers({
    'listItem': () => {
        return List.find().fetch();
})

Template.listItemDetail.helpers({
    'idViaHelper': () => {
        return this._id
})

就我对Meteor中的数据上下文的理解而言,使用#eachlistItemDetail模板的每个实例的上下文设置为从listItem返回的文档帮手。

这就像我在{{_id}}模板中使用listItemDetail时所期望的那样,显示了文档的ID。

但如果我尝试通过使用_id的帮助{{idViaHelper}}获得相同的this._id,我会得到undefined。当我尝试console.log(this)时,它向我显示this指的是Window对象。但我不明白为什么。发生了什么以及为什么数据上下文没有在模板助手中获取?

这是我的第一篇帖子,谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

你对Meteor datacontext流是正确的。 你正在做的是工作。

你只会忘记this代表lambda函数的内容。

从MDN阅读 Lexical this 部分,它比我说的更好解释:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

对于你的情况,直接通过helper获取datacontext的简单方法是通过通常的匿名函数。

试试吧:

Template.listItemDetail.helpers({
    'idViaHelper': function(){
        return this._id
})

那就是它。

你在这个方面很不走运,这里没有与Meteor相关的问题。

您可以找到有用的其他相关问题:meteor helper functions, lambdas and lexical this

答案 1 :(得分:0)

Julien Leray关于词汇this的答案是正确的。使用lambda表达式时会丢失数据上下文。但是,Meteor为您提供了访问模板数据的方法,而无需词汇this,即:

Template.list.helpers({
  'listItem': () => List.find().fetch();
});

Template.listItemDetail.helpers({
  'idViaHelper': () => Template.currentData()._id
});

您可以同时使用Template.currentData()Template.instance().data

另外,请注意,如果您的lambda表达式只包含一个return语句,则可以使用上面的快捷语法。

// ECMAScript 5
var myFunc = function (a, b, c) {
  return b * a - c;
};

变为:

// ECMAScript 6
const myFunc = (a, b, c) => b * a - c;