Jade — Механизм шаблонов: как проверить, существует ли переменная

В настоящее время я использую Jade в новом проекте. Я хочу отобразить страницу и проверить, доступна ли определенная переменная.

app.js:

app.get('/register', function(req, res){
    res.render('register', {
        locals: {
          title: 'Register',
          text: 'Register as a user.',
        }
      });
});

register.jade:

- if (username)
p= username
- else
p No Username!

Я всегда получаю следующую ошибку:

username is not defined

Любые идеи о том, как я могу это исправить?


person mbecker    schedule 21.02.2011    source источник
comment
Кажется, к настоящему времени (2014 г.) мы больше не получаем эту ошибку. Гораздо проще в использовании.   -  person gfaceless    schedule 10.04.2014


Ответы (7)


Это должно работать:

- if (typeof(username) !== 'undefined'){
  //-do something
-}
person Chetan    schedule 21.02.2011
comment
- if (isset(username))' isset не определен - person mbecker; 22.02.2011
comment
Извините, я запутался с PHP и Javascript. Обновил мой ответ. - person Chetan; 22.02.2011
comment
Большое спасибо! Этот код работает: - if (typeof username !== undefined) - person mbecker; 22.02.2011

Проще, чем метод @Chetan, если вы не возражаете против проверки ложных значений вместо неопределенных значений:

if locals.username
  p= username
else
  p No Username!

Это работает, потому что несколько иронично названный locals является корневым объектом для шаблона.

person BMiner    schedule 13.06.2012
comment
Это дает мне ошибку компилятора: объект "builtin_function_or_method" не имеет атрибута "имя пользователя" - person zakdances; 06.02.2013
comment
@yourfriendzak - Вы уверены, что ваша ошибка вызвана этой частью вашего шаблона? - person BMiner; 07.02.2013
comment
Работает отлично, и это лучше, чем использование встроенного javascript, спасибо. - person Sergi Ramón; 12.02.2013
comment
Мне нравится этот ответ, потому что он показывает, что Jade является языком, чувствительным к пробелам. - person Victor.Palyvoda; 25.09.2014
comment
Осторожно, это будет работать, только если переменная была определена в контроллере на этапе render: res.render('view', {username: user.name}); - person Augustin Riedinger; 24.04.2017

if 'username' in this
    p=username

Это работает, потому что res.locals является корневым объектом в шаблоне.

person avoid3d    schedule 23.05.2013

Если вы заранее знаете, что хотите, чтобы конкретная переменная была доступна, но не всегда использовалась, я начал добавлять значение «по умолчанию» в объект помощников.

app.helpers({ username: false });

Таким образом, вы все еще можете выполнить if (username) { без катастрофических сбоев. :)

person Dominic Barnes    schedule 13.06.2012
comment
Спасибо, хотя, к вашему сведению, для Express 3.x это теперь app.locals({ username: false }); - person 7zark7; 09.11.2013
comment
Хороший подход. Обратите внимание, что в Express 4.x app.locals больше не является функцией, поэтому должно быть app.locals.username = false; - person Tom; 12.05.2014

Разве «имя пользователя» не должно быть включено в объект locals?

https://github.com/visionmedia/jade/tree/master/examples

person TK-421    schedule 21.02.2011
comment
Да, но он по-прежнему не должен возвращать undefined, если он предварительно проверен с помощью if. - person JohnAllen; 10.03.2011

Создал промежуточное ПО, чтобы метод isDefined был доступен везде в моих представлениях:

module.exports = (req, res, next) => {
  res.locals.isDefined = (variable) => {
    return typeof(variable) !== 'undefined'
  };  
  next();
};
person Augustin Riedinger    schedule 24.04.2017

Еще проще с мопсом, преемником нефрита

if msg
  p= msg
person I Like    schedule 10.05.2021