Проверка переменной undefined в шаблоне подчеркивания - программирование
Подтвердить что ты не робот

Проверка переменной 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 в моем шаблоне? Я чувствую, что я проверяю его таким же образом в модовом режиме, но по какой-то причине в моем фактическом шаблоне он, похоже, не работает. Является ли моя нотация шаблона правильной? Спасибо.

4b9b3361

Ответ 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+='";
}