假设我打开了一个浏览器,并且在JavaScript中我声明了一个全局变量。
window.myGlobalVar = 'Hello!';
然后我为使用该变量的客户端渲染编译玉模板。
.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
和jade然后只是阴影window
。
为什么不直接传递我想要使用的每个全局?那么在运行时我不确定需要什么全局变量。我有几十个全局构造函数,并且明确地传递它们将需要完全重构。
那么如何以允许引用glbal varaibles的方式编译客户端jade模板?
更新
我确实有点成功。
for (key in window) {
if (localsObject[key] == null)
localsObject[key] = window[key];
}
}
renderTemplate(localsObject);
但该死的,这让我觉得很脏......当然有更好的方法吗?
答案 0 :(得分:3)
您可以将要在jade模板中使用的全局变量的名称与compile函数的options对象一起传递。请参阅jade api docs:http://jade-lang.com/api/
jade.compile(template, { globals: ['globalone','globaltwo']})
看到这个小提琴,看看它的实际效果:http://jsfiddle.net/lchngr/J5WJb/5/