Как создать повторно используемый интерфейс с переменным шаблоном?

Я хочу сделать что-то вроде этого:

Файл компонента:

<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 ответ

Решение

Вы должны быть в состоянии сделать это с динамическими шаблонами. В 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 helper просто нужно вернуть имена шаблонов для использования в качестве строк, например:

Template.dropdown.helpers({
  myElements() {

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

    return {primary: p1, panel: p2 };
  }
});
Другие вопросы по тегам