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



假设我打开了一个浏览器,并在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/

最新更新