【问题标题】:Meteor: access template helpers inside an each statementMeteor:访问每个语句中的模板助手
【发布时间】:2016-03-02 18:59:04
【问题描述】:

因此,如果我有一个模板并且我为该模板定义了一些帮助程序,我可以在模板中正常使用它们,但是如果我尝试在 {{#each whatever}} 中使用它们,它会给我一个错误。看这个例子:

 {{#unless pollIsOpenHelper}}
  <p>This poll closed on {{formatDate time_poll_closed}}.</p>
{{/unless}}

<table>
  {{ #each indexedArray choices }}
    <tr>
      <td><span class="votes">{{ votes }}</span></td>
      <td><span class="text">{{ text }}</span></td>
      <td><a href="#" class="vote" data-id="{{ _index }}"><button>Vote for this option</button></a></td>
    </tr>

    {{#unless pollIsOpenHelper}}
      <p>CLOSED.</p>
    {{/unless}}

  {{ /each }}
</table>

{{#unless}} 中的上述帮助程序完美运行,仅在投票关闭时显示消息。但是,如果我尝试在下面的 {{#each}} 中显示一条消息,则帮助程序不起作用并始终向我显示消息。控制台给我:Exception in template helper: TypeError: Cannot read property 'poll_is_open' of undefined

编辑:这是帮助代码:

  Template.poll.helpers({

    pollIsOpenHelper: function() {
      var poll_is_open = Polls.findOne({_id: this._id}).poll_is_open;

      return poll_is_open;
    },

  });

【问题讨论】:

  • context changes 内部的 #each。没有帮助代码就无法给出准确的答案。
  • 我已经添加了帮助代码

标签: html meteor spacebars


【解决方案1】:

正如其他人所说,您的问题是由 each 循环内的数据上下文变化引起的。这导致 this._id 与您的预期不同。

假设您使用的是 Meteor 1.2.x+ 版本,您可以使用 new {{#each thing in iterable}} 空格键构造来解决此问题,该构造不会覆盖数据上下文。

您可以按如下方式使用它:

{{#each array in indexedArray choices}} 
  //doStuff
{{/each}}

如果您不是使用 Meteor 1.2.x+ 的版本,您可以修改您的助手以获取参数,如下所示:

Template.poll.helpers({
  pollIsOpenHelper: function(poll) {
    var poll_is_open = Polls.findOne({_id: poll._id}).poll_is_open;
    return poll_is_open;
  },
});

在您的模板中将被称为:#each 块之外的{{#unless pollIsOpenHelper this}}#each block 内部的{{#unless pollIsOpenHelper ../}}

【讨论】:

    【解决方案2】:

    您可以从 each 内部调用 Template.instance() 来获取您的实例和助手。

    【讨论】:

    • 你能再解释一下吗?
    猜你喜欢
    • 2014-01-30
    • 2015-03-28
    • 2016-03-04
    • 1970-01-01
    • 2013-02-14
    • 2016-06-10
    • 1970-01-01
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多