【问题标题】:Modify value using a lambda使用 lambda 修改值
【发布时间】:2013-04-24 21:44:43
【问题描述】:

假设我有这个模板,我想用 渲染:

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}} 而不是数字本身。

【问题讨论】:

    标签: hogan.js javascript node.js hogan.js


    【解决方案1】:

    根据@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/

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

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

    【讨论】:

    • 谢谢(虽然我用的是hogan中间件所以不能用~)!而且你完全摧毁了我对 hogan.js 的任何积极看法:O
    • 但是我发现这在以后的 hogan.js 版本比如 3.0.2 上不起作用,我想可能是 hogan 的某些功能已经改变,我还在寻找最佳选择
    • 对于后一个版本,我发现它运行良好{ "wrapped": function() { return function(text) { return Hogan.compile(text).render(this); } } }link
    【解决方案2】:

    我认为这个例子是相关的: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

    【讨论】:

    • 我收到了undefined is not a function
    【解决方案3】:
    capitalize: function(num) {
       return num * 100;
    }
    

    应该适合你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2017-05-13
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多