如何使用变量模板创建可重用的UI?

时间:2016-07-12 17:02:01

标签: meteor spacebars

我想做这样的事情:

组件文件:

<template name="drop_down">
    <span class="dropdown">
        {{> primary_element}} <--- load the template named button
        <span class="dropdown-panel">
            {{> panel_template}} <--- load the template named button_panel
        </span>
    </span>
</template>

用法:

{{> drop_down primary_element="button" panel_template="button_panel"}}
<template name="button"> some styled button </template>
<template name="button_panel"> panel content </template>

然后我可以像这样重用它

{{> drop_down primary_element="tmp_btn_2" panel_template="tmp_panel_2"}}
    <template name="tmp_btn_2"> another button style </template>
    <template name="tmp_panel_2"> other panel content </template>

1 个答案:

答案 0 :(得分:0)

您应该可以使用dynamic templates执行此操作。在blaze中,您可以传递模板以用作变量,以及数据上下文本身。它们非常灵活。

例如:

{{> Template.dynamic template=whichTemplate data=myData }}

这将引用whichTemplate帮助程序来确定要使用的模板,并从myData帮助程序获取数据上下文。即模板的选择和数据的选择都来自变量

在您的情况下,您尝试在dropdown模板的上下文中使用两个动态模板。你可以这样做:

<template name="drop_down">
  {{#with myElements}}
    <span class="dropdown">
      {{> Template.dynamic template=this.primary}}
      <span class="dropdown-panel">
        {{> Template.dynamic template=this.panel}}
      </span>
    </span>
{{/with}}
</template

然后你的myElements助手只需要返回模板名称以用作字符串,例如:

Template.dropdown.helpers({
  myElements() {

    let p1 = "button";  // compute these two based on your own logic
    let p2 = "button_panel";

    return {primary: p1, panel: p2 };
  }
});