灰尘模板包括多次

时间:2014-02-23 16:54:50

标签: javascript templates inheritance extend dust.js

非常确定这是不可能的,但是万一它和我比我聪明的人已经想到了......

我有一系列非常相似的灰尘模板,如:

<div id="some_id" class="inner funform">
  <form id="form_id" action="/do/something">
      <fieldset class="foo">
        <div class="field"><input .../></div>
        <div class="field"><input .../></div>
        <div class="field"><input .../></div>
      </fieldset>

      <fieldset class="bar">
        <div class="field"><input .../></div>
        <div class="field"><input .../></div>
        <div class="field"><input .../></div>
      </fieldset>
</div>

看起来非常低效,继承机制是通过copypasta。

理想情况下,我想做一些我有模板的事情,例如fieldset.dust:

<fieldset class="{+fieldset_class}">
</fieldset>

...并在顶级模板中多次调用,可能如下所示:

<div id="some_id" class="inner funform">
    <form id="form_id" action="/do/something">
        <!-- Here's the magic -->

        {>"fieldset.dust"/}
        {<fieldset_class}fieldset_one{/fieldset_class}
        <div class="field"><input/></div>
        <div class="field"><input/></div>
        <div class="field"><input/></div>

        {>"fieldset.dust"/}
        {<fieldset_class}fieldset_two{/fieldset_class}
        <div class="field"><input/></div>
        <div class="field"><input/></div>
        <div class="field"><input/></div>

        <!-- end magic -->
    </form>
</div> 

但是,当然这最终会使用fieldset 2的内容渲染fieldset。

我已经尝试过显而易见的但是失败了:

{>"fieldset.dust"}
    fieldset content here..
{/"fieldset.dust"}

甚至考虑在模板渲染时通过javascript传递自定义上下文,但这似乎非常难以维护,只是最终渲染模板作为内容传递给另一个模板,我不得不相信这是低效和hacky。

那么有没有办法实现我想要的?或者这是完全错误的方法,并且有更好的方法在尘埃模板中获得DRY?

----更新----

当然,理想情况下,class =“field”div也会通过基本模板呈现,但我希望保持我的示例简单。

1 个答案:

答案 0 :(得分:2)

https://github.com/rragan/dust-motes/tree/master/src/helpers/html/layout中尝试我的@layout帮助器。也可通过npm install dustmotes-layout获得。

我刚刚对它进行了改进,我一直在考虑将参数传递给布局。这使您的案例更容易处理。我试过这个看起来很像你需要的例子:

fieldset.dust

<fieldset class="{name}">
{@layout base="fieldset_body"/}
</fieldset>

fieldset_body.dust

<div class="{bodyClass}"><input></div>

主要模板

{@layout base="fieldset" name="foo" bodyClass="body1"}{/layout}
{@layout base="fieldset" name="bar" bodyClass="body2"}{/layout}

我得到的输出是:

<fieldset class="foo"><div class="body1"><input></div><div class="body1"><input></div></fieldset><fieldset class="bar"><div class="body2"><input></div><div class="body2"><input></div></fieldset>