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

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

Другие вопросы по тегам