dust.js中的表达式和嵌套表达式?

时间:2013-05-22 04:22:11

标签: dust.js

我希望能够在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 Evaluatormath.js这样的JS数学库

2 个答案:

答案 0 :(得分:4)

除了Tom的解决方案之外,还有一个eval帮助器的另一个实现,用于评估包含块。

例如,如果您的上下文中有变量a = 5b = 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文件。