45

在 ejs 模板中检查未定义属性的最佳方法是什么?

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

例子:

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

我希望这会呈现“foo undefined”。它确实会抛出一个foo 未定义的错误。

我知道这不应该是一个问题,因为这是测试中的预期行为。有没有一种简单的方法可以避免这种情况?

我找到的唯一解决方案是使用该hasOwnProperty方法。

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

这不会引发任何错误。

有没有更好的方法来保持模板清洁?或者为什么会抛出这个错误?

4

4 回答 4

72

locals另一种测试属性的方法是通过对象间接引用它。使用您的示例:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
于 2011-09-07T14:06:48.920 回答
31

我会使用typeof, 如if (typeof foo == 'undefined'). 我使用typeof带有字符串“undefined”的运算符,而有些人可能会直接与undefined全局变量进行比较。我更喜欢这种方法,因为它可以防止某些恐怖分子 JS 库开发人员更改全局变量的值,从而使您的代码损坏。

这也可以表示为三元,由于没有花饰,因此有些人认为它“更干净”:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
于 2011-09-02T22:52:15.570 回答
15

我认为最简单,最干净的:

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

于 2014-02-26T23:31:01.650 回答
1

早期版本的 EJS 仅支持locals 但现在在最新版本的 EJS 中支持res.locals

带有三元运算符的示例 -

<%= (res.locals.foo)?"foo":"" %>

使用 if-else 进行采样 -

<% if (res.locals.urvariable) { %>
   <h1><%= urvariable.value1 %></h1> 
<% } else { %> 
   <h1><%= urvariable.value2 %></h1> 
<% } %>
于 2020-05-02T23:07:54.027 回答