试图更好地了解数据上下文在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中的数据上下文的理解而言,使用#each
将listItemDetail
模板的每个实例的上下文设置为从listItem
返回的文档帮手。
这就像我在{{_id}}
模板中使用listItemDetail
时所期望的那样,显示了文档的ID。
但如果我尝试通过使用_id
的帮助{{idViaHelper}}
获得相同的this._id
,我会得到undefined
。当我尝试console.log(this)
时,它向我显示this
指的是Window对象。但我不明白为什么。发生了什么以及为什么数据上下文没有在模板助手中获取?
这是我的第一篇帖子,谢谢你的帮助!
答案 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;