3

次のようなラムダを持つ口ひげテンプレートがあります。

{{#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);
    };
});

次のように、ラムダ関数をBackbone.Modelに渡すMarionette.ItemViewを使用してテンプレートをレンダリングします。

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

奇妙なことに、関数myfuncが呼び出されてコンソールに記録されますが、テンプレートからキーが渡されません。HoganがプリコンパイルモードでLambdaをサポートしていないことについて読みました(約1年前-これは修正されていると思います)-しかし、もしそうなら、myfuncはまったく呼び出されますか?

私はいくつかのデバッグをvendor/hogan.js libに入れました-hoganはラムダタグ間の値(ここではmyvalue)を見ることができないようです。

これを見た人はいますか?

4

1 に答える 1

1

私の調査: grunt-hogan や grunt-templates-hogan などの grunt プラグインを使用している場合にのみ問題が発生します。スクリプトでインラインでレンダリングする前にテンプレートをコンパイルするとHogan.compile()、問題が解決されます。

jsfiddle は grunt を使用してhttps://github.com/twitter/hogan.js/issues/225を発行するようにリンクすることを許可していないため、github で小さなプロジェクトを作成します。

プロジェクト: https://github.com/ssuvorov/hogan-issue

私の解決策は、ラムダを必要なオブジェクト フィールドに置き換えることでした。レンダリングする前に、必要なすべての情報を含むデータを準備することを意味します。

于 2015-07-02T09:03:14.320 に答える