检查ejs模板中未定义属性的最佳方法是什么?
(我正在使用TJ Holowaychuk的node.js package)
示例:
var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz" } }));
我希望这会渲染“foo undefined”。它确实会引发 foo undefined 错误。
我知道这不应该是一个问题,因为这是预期的行为in the tests。有没有一种简单的方法可以避免这种情况?
我找到的唯一解决方案是使用hasOwnProperty
方法。
var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
这不会引发任何错误。
是否有更好的方法来保持模板清洁?或者为什么会抛出这个错误?
答案 0 :(得分:57)
测试属性的另一种方法是通过locals
对象间接引用它。使用您的示例:
var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
答案 1 :(得分:18)
我会使用typeof
,就像if (typeof foo == 'undefined')
一样。我使用typeof
运算符和字符串“undefined”,而有些人可能会与undefined
全局变量进行直接比较。我更喜欢这种方法,因为它可以防止某些恐怖分子JS库开发人员更改全局变量的值,从而使代码损坏。
这也可以表示为三元组,由于没有格拉斯,一些人认为“更干净”:
var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
答案 2 :(得分:9)
我认为最简单,最干净:
<%= (!!locals.foo)?foo:'' %>
答案 3 :(得分:0)
早期版本的EJS仅支持[?, 1-3+2, 3-5+1, 5-1+3, ?]
=[?, 0, -1, 7, ?]
但
现在,在最新版本的EJS中,支持locals
三元运算符样本-
res.locals
if-else样本-
<%= (res.locals.foo)?"foo":"" %>