Проверка переменной undefined в шаблоне подчеркивания
Я показываю модальный вид объектов libraryPrep в моем шаблоне следующим образом:
if (_.isUndefined(this.libraryPreps)) {
this.$el.html(this.template({ }));
} else {
this.$el.html(this.template({ libraryPreps: this.libraryPreps.toJSON() }));
}
Оператор else работает, когда у меня есть объект libraryPreps. В моем шаблоне я использую его следующим образом:
<select id="libraryPreps" >
<% if (!_.isUndefined(libraryPreps)) { %>
<% _.each(libraryPreps, function (libraryPrep) { %>
<option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option>
<% }); %>
<% } %>
</select>
Когда у меня нет объекта libraryPreps, я не получаю мой шаблон для рендеринга, и я получаю сообщение об ошибке на консоли, что libraryPreps undefined. Я неправильно проверяю undefined в моем шаблоне? Я чувствую, что я проверяю его таким же образом в модовом режиме, но по какой-то причине в моем фактическом шаблоне он, похоже, не работает. Является ли моя нотация шаблона правильной? Спасибо.
Ответы
Ответ 1
Если вы передаете переменную функции, она получает оценку и выдает ошибку, поскольку такой переменной нет. Напротив, на вашем скелете вы получаете доступ к объекту объекта, который всегда будет работать (и возвращает значение undefined
, если свойство с этим именем не существует).
Вместо этого вам придется использовать на нем оператор typeof
, который будет работать даже для необъявленных переменных (посмотрите variable === undefined vs. typeof переменная === "undefined" и JavaScript проверяет, существует ли переменная (определена/инициализирована):
<select id="libraryPreps"><%
if (typeof libraryPreps !== "undefined") {
_.each(libraryPreps, function (libraryPrep) { %>
<option value="<%=libraryPrep.id%>"><%= libraryPrep.name %></option><%
});
}
%></select>
Чтобы использовать _.isUndefined
в вашем шаблоне, вам нужно сделать значение явно доступным в шаблоне. Из документы:
По умолчанию template
помещает значения из ваших данных в локальную область с помощью инструкции with
. Однако вы можете указать одно имя переменной с параметром variable
. Это может значительно повысить скорость, с которой шаблон может отображать.
_.template("Using 'with': <%= data.answer %>", {answer: 'no'}, {variable: 'data'});
=> "Using 'with': no"
Таким образом, вы можете писать шаблоны следующим образом:
<% if (!_.isUndefined(data.libraryPreps)) { %> …
<% if ("libraryPreps" in data) { %> …
Ответ 2
У меня была аналогичная проблема, я нашел следующее решение:
Вместо if (typeof libraryPreps !== "undefined") {
Использование: if (!_.isUndefined(obj.libraryPreps)) {
Ответ 3
Я знаю, что это связано со старой темой. Но этот вопрос все еще остается активным.
Я создал решение для своего собственного стека. Может быть полезным для других программистов.
Этот код проверяет, являются ли переменные неопределенными или нулевыми. В случае, если переменные не определены или имеют значение null, возвращается имя переменной. (С синтаксисом шаблона).
Это изменение проверено на underscorejs v1.6.0. С небольшими изменениями это будет работать до 1.9.1. Далее смотрим на Лодаш. Это будет работать с небольшими изменениями!
В сборке dev подчеркивания:
Правило v1.6.0: 1239
Правило более новых версий: 1575
Старый код:
if (escape) {
source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
}
if (interpolate) {
source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
}
if (evaluate) {
source += "';\n" + evaluate + "\n__p+='";
}