假设我打开了一个浏览器,并在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
和jade,然后只是阴影window
。
为什么不把我想使用的每一个全局都通过呢?在运行时,我不确定需要什么全局变量。我有几十个全局构造函数,明确地传递它们将需要相当大的重构。
那么,如何以允许引用glbal变量的方式编译客户端翡翠模板呢?
更新:
我确实在这方面取得了一定的成功。
for (key in window) {
if (localsObject[key] == null)
localsObject[key] = window[key];
}
}
renderTemplate(localsObject);
但该死的,那会让我觉得脏吗。。。肯定有更好的方法吗?
您可以将要在jade模板中使用的全局变量的名称与options对象一起传递给compile函数。请参阅jade api文档:http://jade-lang.com/api/
jade.compile(template, { globals: ['globalone','globaltwo']})
看看这把小提琴,看看它在演奏:http://jsfiddle.net/lchngr/J5WJb/5/