Hogan не поддерживает лямбду в режиме предварительной компиляции
У меня есть шаблон усов с лямбдой, который выглядит так:
{{#myfunc}}myvalue{{/myfunc}}
Он предварительно скомпилирован hogan.js, чтобы выглядеть так:
define(['hogan'],
function (Hogan) {
var template = new Hogan.Template(function (c, p, i) {
var _ = this;
_.b(i = i || "");
if (_.s(_.f("myfunc", c, p, 1), c, p, 0, 11, 18, "{{ }}")) {
_.rs(c, p, function (c, p, _) {
_.b("myvalue");
});
c.pop();
}
return _.fl();;
});
return function (context, partial, indent) {
return template.render(context, partial, indent);
};
});
Я отрисовываю шаблон с помощью Marionette.ItemView, передавая лямбда-функцию в Backbone.Model следующим образом:
myfunc: function (key) { console.log("key", key); }
Странная вещь: функция myfunc будет вызвана и войдет в консоль, но шаблон не пропустит ключ. Я читал о том, что Hogan не поддерживает Lambda в скомпилированном режиме (около года назад - думаю, это исправлено) - но если так, то как это происходит, что myfunc вызывается вообще?
Я добавил отладку в мою библиотеку vendor/hogan.js - похоже, что hogan не может видеть значение между лямбда-тегами (здесь: myvalue).
Кто-нибудь видел это раньше?
1 ответ
Мое исследование: проблема возникает только при использовании плагинов grunt, таких как grunt-hogan или grunt-templates-hogan. Если скомпилировать шаблон перед рендерингом встроенного в сценарий с Hogan.compile()
проблема решена.
Я создаю небольшой проект на github, потому что jsfiddle не позволяет использовать grunt и связывать его для выпуска https://github.com/twitter/hogan.js/issues/225.
Проект: https://github.com/ssuvorov/hogan-issue
Мое решение состояло в том, чтобы заменить лямбды необходимыми полями объекта. Я имею в виду подготовить данные со всей необходимой информацией перед рендерингом.