3

我有一个带有 lambda 的小胡子模板,如下所示:

{{#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 渲染模板,将 lambda 函数传递给 Backbone.Model,如下所示:

myfunc: function (key) { console.log("key", key); }

奇怪的是:函数 myfunc 将被调用并记录到控制台,但模板没有传递密钥。我读到 Hogan 在预编译模式下不支持 Lambda(大约一年前 - 我想这是固定的) - 但如果是这样,它是如何发生的,那 myfunc 被调用了吗?

我在我的 vendor/hogan.js 库中进行了一些调试 - 看起来 hogan 无法看到 lambda-tags 之间的值(这里:myvalue)。

有人见过这个吗?

4

1 回答 1

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

我的解决方案是用必要的对象字段替换 lambda。我的意思是在渲染之前准备好包含所有必要信息的数据。

于 2015-07-02T09:03:14.320 回答