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).

Кто-нибудь видел это раньше?


person Achim Koellner    schedule 13.03.2013    source источник
comment
Вы нашли решение этой проблемы? у меня похожая проблема   -  person DonutReply    schedule 07.01.2015
comment
нет, просто избегал предварительной компиляции. на гитхабе был патч, но мне не удалось его запустить.   -  person Achim Koellner    schedule 13.01.2015


Ответы (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

Мое решение состояло в том, чтобы заменить лямбда-выражения необходимыми полями объекта. Я имею в виду подготовку данных со всей необходимой информацией перед рендерингом.

person Sergey Suvorov    schedule 02.07.2015