Sagen wir, ich habe einen Browser geöffnet, und in JavaScript deklariere ich eine globale Variable.Wie kann eine Jade-Vorlage clientseitige globale Variablen verwenden?
window.myGlobalVar = 'Hello!';
Ich kompiliere dann eine Jade Vorlage für clientseitige Rendering, die diese Variable verwendet.
.foo= myGobalVar
Was ich wie so kompilieren:
jade.compile('.foo= myGobalVar', {
client: true,
compileDebug: false
}).toString()
Welche diese Template-Funktion ergibt:
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("");
}
die, wenn sie lief, würde produzieren:
<div class="foo">undefined</div>
Wie Sie sehen können, bemerkt der Jade-Compiler, dass ich eine Variable verwendet habe, und erzwingt sie als lokale Variable über myGobalVar = locals_.myGobalVar;
, die die globale Variable schattiert, die ich eigentlich verwenden möchte.
Also versuchte ich Referenzierung window.myGlobalVar
und jade dann nur shadowed window
.
Warum nicht einfach alle globalen eingeben, die ich verwenden möchte? Nun, zur Laufzeit bin ich mir nicht sicher, welche Globals notwendig sind. Ich habe dutzende von globalen Konstruktoren, die alle explizit übergeben und das Refactoring erfordern.
Also wie bekomme ich eine Client-Seite Jade-Vorlage in einer Weise kompiliert, die Referenzen auf glbal varaibles ermöglicht?
Update:
ich irgendwie mit diesem Erfolg haben.
for (key in window) {
if (localsObject[key] == null)
localsObject[key] = window[key];
}
}
renderTemplate(localsObject);
Aber Gott verdammt macht das mich schmutzig fühlen ... Sicher gibt es einen besseren Weg?
(nur aufmerksam gemacht zu 'myGobalVar' vs' myGlobalVar') – Kos