一个Jade模板如何使用客户端全局变量?

7
假设我打开了一个浏览器,并在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
为什么不直接传入我想要使用的每个全局变量?好吧,在运行时,我不确定哪些全局变量是必需的。我有几十个全局构造函数,明确传递它们都需要进行相当大的重构。
那么,我该如何编译客户端Jade模板,以便允许引用全局变量?
更新:我确实在这方面取得了一定的成功。
for (key in window) {
  if (localsObject[key] == null)
    localsObject[key] = window[key];
  }
}

renderTemplate(localsObject);

但是这让我感到很不舒服...肯定有更好的方法吧?

1
(只是提醒 myGobalVarmyGlobalVar 的区别) - Kos
1个回答

4
您可以通过选项对象将您想在Jade模板中使用的全局变量名称传递给编译函数。请参阅Jade API文档:http://jade-lang.com/api/
jade.compile(template, { globals: ['globalone','globaltwo']})

请查看这个fiddle,以查看其工作原理:http://jsfiddle.net/lchngr/J5WJb/5/

你的代码片段没有jade文件。 - danielrvt
没有Jade文件!Jade代码是字符串。请再次查看Fiddle并重新考虑您的反对意见。但是导入的momentjs库的链接已经失效了。我更新了Fiddler链接。 - slu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接