ブラウザーを開いて、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);
しかし、なんてこった、それは私を汚く感じさせます... きっともっと良い方法がありますか?