使用lambda修改值

时间:2013-04-24 21:44:44

标签: javascript node.js hogan.js

让我们说一下,我有这个模板,我想用进行渲染:

var template = '{{#numbers}}'
             +     '{{#capitalize}}{{percentage}}{{/capitalize}} complete.\n'
             + '{{/numbers}}';

我用ff编译它:

var hello = hogan.compile(template);

var rendered = hello.render({
  numbers: [
    { percentage: .3 },
    { percentage: .6 },
    { percentage: .8 }
  ],
  capitalize: function() {
    return function(num) {
      // console.log(num);
      return num * 100;
    }
  }
})

console.log(rendered)

如何将数字乘以100而不是NaN

NaN complete.
NaN complete.
NaN complete.

此外,当您取消注释上面的行时,num = {{percentage}}而不是数字本身。

3 个答案:

答案 0 :(得分:7)

基于@akonsu的回复,这是一个关于如何在Hogan.js中获取lambda值的示例。

我在示例中有两个辅助函数manualautomatic,它们可以根据所需的行为包装lambda函数定义。

var source = '{{#numbers}}'
           +     'test1 = {{#test1}}{{percentage}}{{/test1}}\n'
           + '{{/numbers}}'
           + '{{#numbers}}'
           +     'test2 = {{#test2}}{{percentage}}{{/test2}}\n'
           + '{{/numbers}}';

var template = Hogan.compile(source);

var renderer = function(context) {
    return function(text) {
        return template.c.compile(text, template.options).render(context);
    };
};

var manual = function(lambda) {
    return function(text) {
        var render = renderer(this);
        return lambda.call(this, text, render);
    };
};

var automatic = function(lambda) {
    return manual(function(text, render) {
        return lambda.call(this, render(text));
    });
};

var rendered = template.render({
    numbers: [
        { percentage: .3 },
        { percentage: .6 },
        { percentage: .8 }
    ],
    test1: manual(function(text, render) {
        return render(text) * 100;
    }),
    test2: automatic(function(num) {
        return num * 100;
    })
});

console.log(rendered);

输出如下:

test1 = 30
test1 = 60
test1 = 80
test2 = 30
test2 = 60
test2 = 80

这是一个展示解决方案的jsfiddle:http://jsfiddle.net/potatosalad/h5cU4/2/

请注意,此解决方案不适用于partials(如果它们是从lambda部分引用的话)。

Hogan.js 2.0.0的相关代码是lambda replace sectionhigher order functions

答案 1 :(得分:0)

我认为这个例子是相关的:https://github.com/janl/mustache.js#functions。我的猜测是这应该有所帮助:

capitalize: function() {
  return function(text, render) {
    return render(text) * 100;
  }
}

类似帖子:How to get the value when using Lambda in Hogan.js

答案 2 :(得分:0)

capitalize: function(num) {
   return num * 100;
}

应该适合你