Как бы вы проверили неопределенное свойство в ejs для node.js? - PullRequest
29 голосов
/ 03 сентября 2011

Как лучше всего проверить неопределенное свойство в шаблоне ejs?

(я использую пакет node.js от TJ Holowaychuk)

Пример:

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

Я ожидаю, что это сделает "foo undefined". Вместо этого выдается ошибка foo undefined .

Я знаю, что это не должно быть проблемой, так как это ожидаемое поведение в тестах . Есть ли простой способ избежать этого?

Единственное решение, которое я нашел, это использование метода hasOwnProperty.

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

Это не выдает никаких ошибок.

Есть ли лучший способ содержать шаблон в чистоте? Или почему выдает эту ошибку?

Ответы [ 3 ]

57 голосов
/ 07 сентября 2011

Другой способ проверить свойство - это косвенная ссылка на него через объект locals.Используя ваш пример:

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>';
console.log(ejs.render(tpl, { locals: { bar: "baz"} }));
18 голосов
/ 03 сентября 2011

Я бы использовал typeof, как в if (typeof foo == 'undefined').Я использую оператор typeof со строкой undefined, тогда как некоторые люди могут сделать прямое сравнение с глобальной переменной undefined.Я предпочитаю этот метод, потому что он защищен от некоего террористического разработчика библиотеки JS, который изменяет значение глобальной переменной, оставляя ваш код неработающим.

Это также может быть выражено как троичный, что некоторые считают «более чистым» из-задо отсутствия кудрей:

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<% ) %>';
9 голосов
/ 27 февраля 2014

Самый простой и чистый на мой взгляд:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...