6

ブラウザーを開いて、JavaScript でグローバル変数を宣言するとします。

window.myGlobalVar = 'Hello!';

次に、その変数を使用するクライアント側レンダリング用の jade テンプレートをコンパイルします。

.foo= myGobalVar

私は次のようにコンパイルします:

jade.compile('.foo= myGobalVar', {
  client: true,
  compileDebug: false
}).toString()

これにより、このテンプレート関数が生成されます。

function anonymous(locals) {
    var buf = [];
    var locals_ = (locals || {}),
        myGobalVar = locals_.myGobalVar;
    jade.indent = [];
    buf.push("\n<div class=\"foo\">"
             + (jade.escape(null == (jade.interp = myGobalVar) ? "" : jade.interp))
             + "</div>");;
    return buf.join("");
}

実行すると、次のものが生成されます。

<div class="foo">undefined</div>

ご覧のとおり、jade コンパイラは、変数を使用したことを認識し、myGobalVar = locals_.myGobalVar;実際に使用したいグローバル変数をシャドウする を介して強制的にローカル変数にします。

だから私は参照してみwindow.myGlobalVarました と ジェイド それからただ影をつけwindowました。

使用したいすべてのグローバルを渡さないのはなぜですか? 実行時には、どのグローバルが必要かわかりません。私は何十ものグローバル コンストラクターを持っており、それらをすべて明示的に渡すにはかなりのリファクタリングが必要です。

では、グローバル変数への参照を可能にする方法でコンパイルされたクライアント側の jade テンプレートを取得するにはどうすればよいでしょうか?


アップデート:

私はこれで何とか成功しました。

for (key in window) {
  if (localsObject[key] == null)
    localsObject[key] = window[key];
  }
}

renderTemplate(localsObject);

しかし、なんてこった、それは私を汚く感じさせます... きっともっと良い方法がありますか?

4

1 に答える 1

3

オプション オブジェクトを使用して、jade テンプレートで使用するグローバルの名前を compile 関数に渡すことができます。ジェイド API ドキュメントを参照してください: http://jade-lang.com/api/

jade.compile(template, { globals: ['globalone','globaltwo']})

実際の動作を確認するには、このフィドルを参照してください: http://jsfiddle.net/lchngr/J5WJb/5/

于 2014-02-11T21:48:13.027 に答える