2011-09-02 44 views
27

檢查ejs模板中未定義屬性的最佳方法是什麼?如何檢查ejs中的未定義屬性是否爲node.js?

(我使用的是node.js package由TJ Holowaychuk)

例子:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz" } })); 

我期望這使 「富未定義」。它確實會拋出一個foo undefined錯誤。

我知道這不應該是一個問題,因爲這是預期的行爲in the tests。有沒有簡單的方法來避免這種情況?

我發現的唯一解決方案是使用hasOwnProperty方法。

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

這不會產生任何錯誤。

有沒有更好的方法來保持模板清潔?或者爲什麼會拋出這個錯誤?

回答

49

的另一種方法來測試一個屬性是經由locals對象間接地引用它。使用你的例子:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 
+0

這就是我想要的。 :) – pvorb

+6

正是我所需要的,但跆拳道,爲什麼你必須這樣做?! :) –

+0

不確定沒有檢查源,但我懷疑模板引擎不打擾範圍變量的未定義值。 –

15

我會用typeof,如if (typeof foo == 'undefined')。我使用字符串「undefined」的typeof運算符,而有些人可能會與undefined全局變量進行直接比較。我更喜歡這種方法,因爲它可以防止一些恐怖分子的JS庫開發人員更改全局變量的值,從而導致代碼被破壞。

這也可以表示爲一個三進制,其中的一些視圖爲「清潔器」由於不存在花括號的:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<%) %>'; 
+1

這個工作,也許它的形式上正確的一個。但我個人不喜歡它,因爲它對我的模板來說太長了。 – pvorb

+1

請注意,這是使用客戶端EJS模板的唯一方法。其他方法依賴於檢查客戶端模板中不存在的res對象。 – dbasch

9

最簡單和乾淨在我看來:

<%= (!!locals.foo)?foo:'' %>

+3

當地人似乎已經轉移到後來的ejs版本的res對象。 – dbasch

相關問題