2013-04-24 2 views
3

Скажем, за входом в инстанс у меня есть этот шаблон я хотел сделать с :Изменить значение с помощью лямбда

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

И я скомпилировать его с ФФ:

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 isntead geting NaN?

NaN complete. 
NaN complete. 
NaN complete. 

Кроме того, когда вы раскомментировать эту строку, num = {{percentage}} вместо самого числа.

ответ

7

на основе ответа по @akonsu, вот пример того, как вы могли бы получить значение лямбда в Hogan.js.

У меня есть две вспомогательные функции в примере: manual и automatic, которые могут обертываться вокруг определения функции лямбда в зависимости от желаемого поведения.

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/

Обратите внимание, что это решение не будет работать с частичными (если они отсчитываются от внутри лямбда-раздел).

Соответствующий код для Hogan.js 2.0.0: lambda replace section и higher order functions.

+0

Большое вам спасибо! – Michelle

+0

Спасибо (хотя я не мог использовать его, поскольку я использую промежуточное ПО hogan ~)! И вы просто полностью уничтожили любые положительные мнения, которые я придерживался по поводу hogan.js: O –

+0

, но я нашел, что это не работает на более поздней версии hogan.js, например 3.0.2, я думаю, возможно, что какая-то функция hogan была изменена, я все еще смотрю для лучшей chooice – andyCao

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

должен работать для вас

Смежные вопросы