如何在dust.js中处理默认值作为部分参数?

时间:2015-03-05 16:08:41

标签: template-engine dust.js

我实际上制作了一个简单的灰尘部分,我想给它一些默认值的参数。不是很容易解释,但这是一个简单的例子:


局部模板

分音/ hello.dust

{?label}{label}{:else}Hello{/label}: 
<span>{?name}{name}{:else}World{/name}</span>

分音/ hello2.dust

{>"partials/hello"/} and 
{>"partials/hello" label="{label2}" name="{name2}"/}</div>

如何运作的示例

test_0.dust

{>"partials/hello2" label="Peter" name="Parker" label2="Clark" name2="Kent"/}

回归:“彼得:帕克和克拉克:肯特”

test_1.dust

{>"partials/hello2" label2="Clark" name2="Kent"/}

返回:“你好:世界和克拉克:肯特”

test_2.dust

{>"partials/hello2" label="Peter" name="Parker"/}

返回:“Peter:Parker和Hello:World”

test_3.dust

{>"partials/hello2"/}

返回:“Hello:World and Hello:World”


在partials / hello.dust中,如果标签&amp;名称变量未定义,它们将替换为默认值(分别为“Hello”和“World”)

所以这里,test_0.dust和test_1.dust将起作用,因为我提供了label2和name2参数。

在partials / hello2.dust中,我不知道这是否可以以优雅的方式执行此操作,但我想为label2和name2变量设置不同的默认值,因此不必提供它们(“Hello2” “和”World2“例如)。

我能想到的一个解决方案是在hello2.dust中处理所有可能的组合,包括相应的部分(即label2为空,name2为空,label2为空,name2为空,label2为空,name2为空,label2为空,label2为空, name2不是空的)但是你可以看到它可能非常痛苦和丑陋。

要明确我希望能够做到这样的事情:

分音/ hello2.dust

{>"partials/hello"/}
{>"partials/hello" label="{?label2}{label2}{:else}Hello2{/label2}" name="{?name2}{name2}{:else}World2{/name2}"/}


如果它能帮到某人,我终于自己做了一个帮手:

'use strict';

module.exports = function (dust) {
    dust.helpers.default = function (chunk, ctx, bodies, params) {
        var resData, paramVals = {}, saveData = chunk.data;

        var localCtx = ctx;
        if (params) {
            localCtx = ctx.push(params);
        }
        for (var key in bodies) {
            if (key !== 'block') {
                chunk.data = [];
                resData = bodies[key](chunk, localCtx).data.join('');
                if (typeof ctx.get(key) === 'undefined') {
                    paramVals[key] = resData;
                }
            }
        }
        chunk.data = saveData;
        return bodies.block(chunk, localCtx.push(paramVals));
    };
};

所以,它可以像这样使用:

{@default}
{>"partials/mypartialusingname1"/}
hello {name1} & {name2} 
{:name1}Chuck Norris
{:name2}Walter White
{/default}

然后,如果当前上下文中不存在name1和name2,则它将替换为某些默认值。

2 个答案:

答案 0 :(得分:2)

Dust不包含用于设置上下文默认值的工具。

这将是一个尘埃助手的工作。这个助手的天真版本可能如下所示:

模板

{@defaultParam key="hello" value="moo"/}
{@defaultParam key="world" value="world"/}
{hello} {world}

上下文

{
    "hello": "hello"
}

辅助

dust.helpers.defaultParam = function(chunk, context, bodies, params) {
  var key = params.key,
      value = params.value;

  if(typeof context.get(key) === 'undefined') {
    context.global[key] = value;
  }
};

答案 1 :(得分:0)

我们通过创建类似的帮助程序解决了这个问题。在单个@defaults帮助程序声明中使用键值属性。

父模板

<!-- Standard partial include -->
{>"components/module-promo" /}

<!-- Partial include with overrides -->
{>"components/module-promo" title="Custom title override" caption="Custom caption" /}

部分

{@defaults
    title="Module title"
    caption="Module caption ipsum dolor sit amet."
/}

<article>
    <h2>{title}</h2>
    <p>{caption}</p>
</article>

辅助

dust.helpers.defaults = function(chunk, context, bodies, params) {
    for (var key in params) {
        context.global[key] = params[key];
    }
    return chunk;
};

(请记住从帮助函数返回chunk。)

这对于同步模板渲染非常有效。我们将值存储在context.global上,并在部分编译时添加/修改它们。这意味着global已发生变异,但我们确实避免了使用相同参数名称的多个部分问题。

如果尝试流式传输/异步模板渲染,则该方法会遇到麻烦。也许有人可以详细说明存储部分特定上下文值的最佳方法来改善这一点吗?