2013-07-08 48 views
6

可以說我打開了一個瀏覽器,並在JavaScript中聲明瞭一個全局變量。Jade模板如何使用客戶端全局變量?

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> 

正如你所看到的,玉器編譯器注意到我使用了一個變量,並通過myGobalVar = locals_.myGobalVar;強制它成爲局部變量,這影響了我實際想要使用的全局變量。

所以我嘗試引用window.myGlobalVar和玉然後只是影子window

爲什麼不僅僅傳遞給我想要使用的每個全球?那麼在運行時我不知道什麼樣的全局變量是必要的。我有幾十個全局構造函數,並且明確地傳遞它們將需要相當的重構。

那麼如何獲得一個客戶端玉模板編譯的方式,允許引用glbal變量?


更新:

我也有點這種成功。

for (key in window) { 
    if (localsObject[key] == null) 
    localsObject[key] = window[key]; 
    } 
} 

renderTemplate(localsObject); 

但該死的讓我覺得髒......當然有更好的辦法嗎?

+1

(只將注意力集中在'myGobalVar' VS'myGlobalVar') – Kos

回答

2

您可以將選項對象傳遞給編譯函數,並將您想要在jade模板中使用的全局變量的名稱傳遞給編譯函數。見玉API文檔:http://jade-lang.com/api/

jade.compile(template, { globals: ['globalone','globaltwo']}) 

看到這個小提琴看到它在行動:http://jsfiddle.net/lchngr/J5WJb/5/

+0

你的小提琴沒有玉文件 – danielrvt

+0

有是沒有玉檔的!玉代碼是字符串。請再次看看小提琴並重新考慮你的投票。但是導入的momentjs lib的鏈接被破壞了。我更新了提琴手鍊接 – slu