【问题标题】:Meteor: How to include a template only if it exists?Meteor:如何仅在模板存在时才包含模板?
【发布时间】:2014-05-14 05:05:09
【问题描述】:

我正在创建一个 Meteorite 包,它为特定集合呈现一个表格。我希望通过添加可选的自定义列作为模板来自定义此表:

<template name="myPluginTable">
  <table>
    <thead>
      <th>Column 1</th>
      <th>Column 2</th>
      {{> customHeaders}}
    </thead>
    <tbody>
      {{#each objects}}
        <tr>
          <td>{{firstValue}}</td>
          <td>{{secondValue}}</td>
          {{> customFields}}
        </tr>
      {{/each}}
    </tbody>
  </table>
</template>

现在只要在应用程序的某处指定模板customHeaders 和customFields,它就可以正常工作。

但是如果省略这些模板,则会引发错误。这也不能通过向包中添加虚拟模板来规避,因为尝试覆盖它们也会引发错误。

我想出的解决方案:

Template.myPluginTable.helpers({
  customHeadersExist: function() {
    return typeof(Template.customHeaders) === "object";
    },
  customFieldsExist: function(user) {
    return typeof(Template.customFields) === "object";
  },
});

在模板中:

{{#if customHeadersExist}}
  {{> customHeaders}}
{{/if}}

和

{{#if customFieldsExist}}
  {{> customFields}}
{{/if}}

现在这个工作,但是对于这样一个简单的任务,解决方案似乎过于复杂——我真的需要为每个可选模板声明辅助函数吗?所以我的问题真的是:

使包自定义模板可选的最佳方法是什么?是这样,还是有更好的方法?

【问题讨论】:

    标签: javascript meteor spacebars


    【解决方案1】:

    我想到的最简单的解决方案是实现一个自定义助手:

    UI.registerHelper('safeRender', function () {
      var component = Template[this.name];
      if (component) {
        return component.extend({data: this.data});
      }
      return UI.Component;
    });
    

    您可以像这样在模板中使用它:

    {{> safeRender name='customHeaders' data=.}}
    

    data=. 部分用于确保模板将在相同的数据上下文中呈现。

    【讨论】:

    • 很好,这行得通,谢谢。关于包含运算符的这种行为的空格键文档有些缺乏信息(或者我只是愚蠢),但我想这是您为使用未完成的框架所付出的代价。再说一次,我可以停止抱怨并自己为改进文档做出贡献。
    猜你喜欢
    • 2015-11-13
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 2012-08-15
    相关资源
    最近更新 更多