我希望能够在dust.js中添加这样的值:
this is x+1 : {{x}+1} //does not work :'(
我知道我可以用助手(可怕的冗长)来做到这一点
this is x+1 : {@math key="x" method="add" operand="1" /}
我可以与之共处(但不高兴)
但是当我想要嵌套参数时呢?
this is x+1+1 : {@math key='{@math key="x" method="add" operand="1" /}' method="add" operand="1" /} // no dice and wins ugly code prize!
this is x+1+1 : {@math key='x' method="add" operand="1"} {@math key="selectKey" method="add" operand="1" /} {/math} //still no dice - btw selectKey is an output variable for the @math helper
有可能这样做吗?我很想尝试在核心库中修补它,因为它让我非常讨厌。
还有其他方法吗?创建临时变量(即{xplus1})?我目前的解决方案是将任何/所有逻辑移动到帮助者 - 我正在写很多帮助者。
更新
我编写了一个可以创建范围变量的帮助器。这似乎是一种干净的方式。
{@eval xplus1="{x} + 1"}
... scope where x = x+1
this is x+1 : {xplus1}
{/eval}
现在它正在使用JavaScript eval,但我正在考虑使用像JavaScript Expression Evaluator或math.js这样的JS数学库
答案 0 :(得分:4)
除了Tom的解决方案之外,还有一个eval
帮助器的另一个实现,用于评估包含块。
例如,如果您的上下文中有变量a = 5
和b = 10
,
{@eval}{a} + {b} + 100{/eval}
将呈现为115
。
你也可以撰写这些证据:
{@eval}{a} + {b} + {@eval}{a} + {b} + 100{/eval}{/eval} //Would render 130
以下是代码:
dust.helpers.eval = function(chunk, context, bodies) {
var expression = '';
chunk.tap(function(data) {
expression += data;
return '';
}).render(bodies.block, context).untap();
chunk.write(eval(expression));
return chunk;
}
答案 1 :(得分:1)
这里是'eval' - 我担心我没有测试它,但它应该工作。在https://github.com/linkedin/dustjs-helpers/blob/master/lib/dust-helpers.js和其他助手一起添加。
"eval" : function( chunk, context, bodies, params ){
var body = bodies.block, exp, param, exps = {};
for(param in params){
if(Object.hasOwnProperty.call(params,param)){
exp = dust.helpers.tap(param, chunk, context);
exps[param]=eval(exp);
}
}
if(body) {
context = context.push(exps);
return chunk.render( bodies.block, context );
}
else {
_console.log( "Missing body block in the eval helper!" );
return chunk;
}
};
你必须包含dust-helpers.js以及主要的尘埃js文件。