Meteor:如果模板存在,如何包含模板?

时间:2014-04-02 18:05:15

标签: javascript meteor spacebars

我正在创建一个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>

现在,只要在应用中的某处指定了模板customHeaderscustomFields,这就可以正常工作。

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

我提出的解决方案:

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}}

现在这个工作,但对于这么简单的任务来说,解决方案看起来显得过于​​复杂 - 我真的需要为每个可选模板声明帮助函数吗?所以我的问题是:

将软件包自定义模板设置为可选的最佳方法是什么?是这样,还是有更好的方法?

1 个答案:

答案 0 :(得分:4)

我想到的最简单的解决方案是实现自定义帮助程序:

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=.部分用于确保模板将在相同的数据上下文中呈现。