2

假设我有一个显示小部件的 Meteor 应用程序。小部件可以具有以下几种形式之一:

<template name="textWidget">
    <h1>{{myTitle}}</h1>
    <p>{{myTextContent}}</p>
</template>

<template name="imgWidget">
    <h1>{{myTitle}}</h1>
    <img src="{{myImagePath}}" />
</template>

<template name="listWidget">
    <h1>{{myTitle}}</h1>
    <ul>
       {{#each items}}
          {{> listWidgetItem}}
       {{/each}}
    </ul>
</template>

给定记录类型是否有渲染特定模板的好模式?

天真地,我可以做类似的事情:

<template name="masterTemplate">
    {{#each widgets}}
        {{#if widgetType "text"}}
            {{> textWidget}}
        {{else}}
            {{#if widgetType "img"}}
               {{> imgWidget}}
            {{else}}
               {{if ... }} ... {{/if}}
            {{/if}}
        {{#/if}}

    {{/each}}
</template>

有一个像这样的助手:

Template.masterTemplate.widgetType = function(cmp) {
    return cmp === this.data.type;
};

不过,这似乎是一种非常笨拙且不灵活的操作方式。我是否缺少此用例的明显库或设计模式?

4

1 回答 1

4

你可以尝试这样的事情:

UI.registerHelper('widget', function () {
  var templateName = this.data.type + 'Widget';
  return Template[templateName].extend({ data: this });
});

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

{{> widget context}}

或者

{{#with context}}
  {{> widget}}
{{/with}}
于 2014-05-20T21:30:26.700 回答