嵌套的#Each 值在上下文之外不可用
Nested #Each values are not available outside of the context
我有一个嵌套的每一对,如下所示:
{{#目标中的每个目标}}
<template name="task">
{{#each goal in goals}}
{{#each task in relatedTasks goal}}
<li>
<span class="text task"><a href="#modal-taskedit" data-toggle="modal"><strong>{{task.taskName}}</strong></a> to {{goal.goalName}}<br> taskid: {{task._id}}
{{task.taskPostpone}}</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=task._id}}
Update {{task.taskName}}
{{/afModal}}
</li>
{{/each}}
{{/each}}
</template>
并想在我的 client.js 中获取 task._id 的值,如下所示:
Template.task.events({
'click .task': function() {
Session.set("selectedTask", this._id);
//console.log(this._id);
//console.log(goal._id);
console.log(task._id);
//console.log('Click event happened: this._id saved as selectedItem Session variable.');
}
});
当我单击任务时,我在控制台上收到此错误:"undefined" 我不太明白背后的原因。我做了一些研究并找到了一个可能的解决方案:也许 'click .task':函数(任务)应该接收任务上下文或输入,以便能够掌握 this._id 的含义。
我有一个 {{#afModal doc=task._id}} 它也应该接收 task._id 的值并且似乎不起作用,尽管我认为它被放置在正确的上下文中。
我有一种感觉,这两个问题在某种程度上是相关的。
问题在于 {{#each goal in goals}}
循环语法不会更改循环内的数据上下文 (see docs)。它只是添加一个 goal
变量以供您的空格键模板使用。
一个解决方案是像这样将 {{#each task in ...}}
循环的内容移动到另一个模板。
<template name="task">
{{#each goal in goals}}
{{#each task in relatedTasks goal}}
{{> goalTask goal=goal task=task}}
{{/each}}
{{/each}}
</template>
<template name="goalTask">
<li>
<span class="text task">
<a href="#modal-taskedit" data-toggle="modal"><strong>{{task.taskName}}</strong></a>
to {{goal.goalName}}<br>
taskid: {{task._id}} {{task.taskPostpone}}
</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=task._id}}
Update {{task.taskName}}
{{/afModal}}
</li>
</template>
您的事件处理程序将如下所示。
Template.goalTask.events({
'click .task': function() {
console.log(this.goal._id);
console.log(this.task._id);
}
});
这是嵌套对象中事件的常见问题,如何获取被点击对象的数据上下文?
解决此问题的最简单方法是为每一层嵌套创建一个模板。然后自动提供适当的上下文。
<template name="goals">
{{#each goals}}
{{#each task}}
{{> task}}
{{/each}}
{{/each}}
</template>
<template name="task">
<li>
<span class="text task"><a href="#modal-taskedit" data-toggle="modal">
<strong>{{task.taskName}}</strong></a> to {{goal.goalName}}<br>
taskid: {{task._id}}{{task.taskPostpone}}</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=_id}}
Update {{task.taskName}}
{{/afModal}}
</li>
</template>
然后您的事件处理程序可以在内部任务模板上定义,数据上下文自动成为单独的任务,而不是外部模板的数据上下文。
Template.task.events({
'click .task': function(){
Session.set("selectedTask", this._id);
}
});
我有一个嵌套的每一对,如下所示: {{#目标中的每个目标}}
<template name="task">
{{#each goal in goals}}
{{#each task in relatedTasks goal}}
<li>
<span class="text task"><a href="#modal-taskedit" data-toggle="modal"><strong>{{task.taskName}}</strong></a> to {{goal.goalName}}<br> taskid: {{task._id}}
{{task.taskPostpone}}</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=task._id}}
Update {{task.taskName}}
{{/afModal}}
</li>
{{/each}}
{{/each}}
</template>
并想在我的 client.js 中获取 task._id 的值,如下所示:
Template.task.events({
'click .task': function() {
Session.set("selectedTask", this._id);
//console.log(this._id);
//console.log(goal._id);
console.log(task._id);
//console.log('Click event happened: this._id saved as selectedItem Session variable.');
}
});
当我单击任务时,我在控制台上收到此错误:"undefined" 我不太明白背后的原因。我做了一些研究并找到了一个可能的解决方案:也许 'click .task':函数(任务)应该接收任务上下文或输入,以便能够掌握 this._id 的含义。 我有一个 {{#afModal doc=task._id}} 它也应该接收 task._id 的值并且似乎不起作用,尽管我认为它被放置在正确的上下文中。 我有一种感觉,这两个问题在某种程度上是相关的。
问题在于 {{#each goal in goals}}
循环语法不会更改循环内的数据上下文 (see docs)。它只是添加一个 goal
变量以供您的空格键模板使用。
一个解决方案是像这样将 {{#each task in ...}}
循环的内容移动到另一个模板。
<template name="task">
{{#each goal in goals}}
{{#each task in relatedTasks goal}}
{{> goalTask goal=goal task=task}}
{{/each}}
{{/each}}
</template>
<template name="goalTask">
<li>
<span class="text task">
<a href="#modal-taskedit" data-toggle="modal"><strong>{{task.taskName}}</strong></a>
to {{goal.goalName}}<br>
taskid: {{task._id}} {{task.taskPostpone}}
</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=task._id}}
Update {{task.taskName}}
{{/afModal}}
</li>
</template>
您的事件处理程序将如下所示。
Template.goalTask.events({
'click .task': function() {
console.log(this.goal._id);
console.log(this.task._id);
}
});
这是嵌套对象中事件的常见问题,如何获取被点击对象的数据上下文?
解决此问题的最简单方法是为每一层嵌套创建一个模板。然后自动提供适当的上下文。
<template name="goals">
{{#each goals}}
{{#each task}}
{{> task}}
{{/each}}
{{/each}}
</template>
<template name="task">
<li>
<span class="text task"><a href="#modal-taskedit" data-toggle="modal">
<strong>{{task.taskName}}</strong></a> to {{goal.goalName}}<br>
taskid: {{task._id}}{{task.taskPostpone}}</span>
{{#afModal class="btn btn-primary" collection="Tasks" operation="update" doc=_id}}
Update {{task.taskName}}
{{/afModal}}
</li>
</template>
然后您的事件处理程序可以在内部任务模板上定义,数据上下文自动成为单独的任务,而不是外部模板的数据上下文。
Template.task.events({
'click .task': function(){
Session.set("selectedTask", this._id);
}
});