我正在创建一个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}}
现在这个工作,但对于这么简单的任务来说,解决方案看起来显得过于复杂 - 我真的需要为每个可选模板声明帮助函数吗?所以我的问题是:
将软件包自定义模板设置为可选的最佳方法是什么?是这样,还是有更好的方法?
答案 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=.
部分用于确保模板将在相同的数据上下文中呈现。