2011-09-02 31 views
27

ejsテンプレートで未定義のプロパティをチェックする最良の方法は何ですか?node.jsのejsで未定義のプロパティを調べるにはどうすればよいですか?

(私はTJ Holowaychukでnode.js packageを使用しています)

例:

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

私は、これは "未定義foo" をレンダリングするために期待したいです。代わりに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

私はをif (typeof foo == 'undefined')のように使用します。私はtypeof演算子を文字列 "undefined"で使用しますが、一部の人はグローバル変数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

関連する問題