【问题标题】:How to pass a template variable to a template helper function to preserve context?如何将模板变量传递给模板辅助函数以保留上下文?
【发布时间】:2013-07-30 10:14:17
【问题描述】:

我可能用错误的词来描述我的问题,所以这里是我正在使用的(简化的)代码。

我很高兴学习一种更好的方法来做到这一点,但我目前正在尝试做的是将{{assigneeId}} 传递给名为agentIs 的模板辅助函数。问题是我找不到传递值的正确方法。

<template name="ticket_list">
  {{#each tickets}}
    {{> ticket}}
  {{/each}}
</template>

<template name="ticket">
  <h3>{{title}}</h3>
  <p>{{assigneeId}}</p>
  {{> ticket_footer}}
</template>

<template name="ticket_footer">
  {{> agent_list}}
</template>

<template name="agent_list">
  <!-- {{assigneeId}} exists here as expected -->
  assigneeId: {{assigneeId}}
  <label for="agent">Agent</label>
  <select id="agent" name="agent">
    {{#each agents}}
      <!-- value passed: "{{assigneeId}}" -->
      <option value="{{_id}}" {{#if agentIs "{{assigneeId}}"}}selected{{/if}}>
        {{profile.name}}
      </option>
      <!-- value passed: undefined -->
      <option value="{{_id}}" {{#if agentIs assigneeId}}selected{{/if}}>
        {{profile.name}}
      </option>
      <!-- value passed: JSON.parse error -->
      <option value="{{_id}}" {{#if agentIs {{assigneeId}}}}selected{{/if}}>
        {{profile.name}}
      </option>
    {{/each}}
  </select>
</template>
Template.agent_list.agents = function() {
  return Meteor.users.find({"profile.is_agent": true}, {sort: {profile: 1}});
}

Template.agent_list.agentIs = function(assigneeId) {
  return this._id === assigneeId;
};

【问题讨论】:

  • 为什么不能将一些模板调用包装到with 块助手中?或者我没有得到问题。
  • @imslavko 请写一个例子并将其添加为答案。我是 Meteor 和 Handlebars 的新手,如有任何关于实施的反馈,我们将不胜感激。

标签: meteor handlebars.js


【解决方案1】:

正确的语法是:

{{#if agentIs ../assigneeId}}selected{{/if}}

{{#each agent}} 块助手在模板上下文树中引入了一个新级别(新上下文对应于当前代理),这就是为什么您需要从一个级别“返回”以正确引用assigneeId 所在的先前上下文。

【讨论】:

  • 我完全理解你在说什么,尽管我从未想到过这种语法,我什至不知道如何找到它。这种语法有正式名称吗?
  • handlebarsjs.com 是模板系统。 docs.meteor.com/#templates - Meteor 的文档。
  • 哇,../ 的东西让我大吃一惊。无法告诉您在循环内容以访问父级时这会有多大帮助。希望这被记录在 docs.meteor.com 的某个地方。如果是我没见过。
  • 我在官方文档中发现的唯一一处是:docs.meteor.com/#template_parentdata 这个语法源自 Handlebars,它是 Meteor 模板系统 Spacebars 的基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 2020-10-23
  • 2017-11-10
  • 1970-01-01
相关资源
最近更新 更多