3

Swigテンプレートエンジンの拡張タグを条件付きにする方法、または渡された変数を使用できるようにする方法を知っている人はいますか?

これの代わりに:

{% extends '../layouts/layout.view' %}

私はこれをしたいです

{% extends layout %}

Express.jsでこれを使用してファイルをレンダリングしながら

res.render('jobs/index', { title: 'Jobs', layout: '../layouts/layout.view' });

誰かが前にこれをしましたか?テンプレート拡張を条件付きにするか、文字列の代わりに変数を渡します。助けていただければ幸いです。

4

2 に答える 2

2

私はこれを解決することができました。少なくとも、数行を変更することで、必要なものを手に入れました。

ソリューションが本質的に行うことは、関数から関数にlocalsパラメーターをそのまま渡すことです。renderFilecompileFile

  this.renderFile = function (pathName, locals, cb) {
    if (cb) {
      exports.compileFile(pathName, locals, function (err, fn) { 
        if (err) {
          cb(err);
          return; 
       }
       cb(null, fn(locals));
     });
     return;
   }

   return exports.compileFile(pathName, locals)(locals);
 };

これは、ファイルの行514と行で発生します。地元の人々は本質的になる524/lib/swig.jsoptions

405次に、これを同じファイルの行に追加しただけです

if(options.layout) 
  parentName = options.layout;

Express のルート定義で res.render コマンドを呼び出しながら、レイアウトの相対位置を指定してレイアウト オプションを追加するだけです。

res.render('index', { title: 'Express', layout: 'layouts/main.layout' });

これで問題は完全に解決しました。レイアウトを動的に設定しながら、通常の機能を維持し{% extend %}ます (オプションでオーバーライドしない場合)。layout

唯一の欠点は、それlayoutが予約済みのオプションになることです。これをリファクタリングして、問題にならないようにすることができます。

これが誰かに役立つことを願っています。2 行の変更と 2 行のコードにより、動的なレイアウトが可能になりました。性能は同じです。

于 2013-11-04T21:49:52.430 に答える
2

Swig では条件付き拡張は許可されていません。これは、テンプレートのレンダリングを高速化し、事前コンパイルを改善するための仕様です。テンプレートが解析されると、その親チェーンが解決され、指定されたテンプレートに対して一度に一緒にコンパイルされます。これにより、テンプレートが異なるローカル コンテキストで実行されるたびに実行する必要がある必要な手順がすべて削除されます。

あまりきれいではありませんが、別の解決策は、includes を使用することです。メイン コンテンツを 1 つのファイルに入れますが、使用するレイアウトに応じて 2 つの別個のファイルをレンダリングします。

レイアウト 1 が必要な場合は、このファイルをレンダリングします。

{% extends "layout1.html" %}
{% block body %}
    {% include "content.html" %}
{% endblock %}

そして、レイアウト 2 が必要な場合は、このファイルをレンダリングします。

{% extends "layout2.html" %}
{% block body %}
    {% include "content.html" %}
{% endblock %}
于 2013-11-04T05:15:46.947 に答える