Использование кода javascript в представлениях Jade - если (переменная) показывает undefined вместо передачи

Итак, это повторяющаяся проблема, с которой я столкнулся, и я не нашел другого примера на SO, поэтому вот:

При рендеринге шаблонов Jade я получаю 'variableName' undefined даже при использовании -if(variableName) в шаблоне.

Пример (я использую это как частичное для информационных флеш-сообщений):

-if(info)
  - if(info.length){
   ul
   -info.forEach(function(info){
     li= info
  -})
-}

Это возвращает «информация» не определена вместо того, чтобы ничего не отображать, когда нет флэш-сообщения/информации. Кто-нибудь знает, что я делаю неправильно?

Я знаю об опции typeof(variable) != 'undefined, как уже упоминалось. Если бы я хотел сделать что-то вроде -if (typeof(req.session.user) != 'undefined'), мне пришлось бы сделать 3 вложенных `if (typeof(req) != 'undefined'. Это мой единственный вариант?


person JohnAllen    schedule 21.04.2011    source источник
comment
Будьте осторожны: «информация» (переданная как имя параметра) в функции (информация) полностью отличается от той, которую вы используете в операторах if. Это не решит проблему, но сделает код более читаемым.   -  person timoxley    schedule 23.04.2011


Ответы (4)


попробуй if(typeof info !== "undefined").

Я не слишком уверен, но я думаю, что они используют with для ввода переменных в область вашего представления.

with({}) {
    if (foo) {
         console.log("foo"); // fails foo is not defined.
    }
}

with({}) {
    if (typeof foo !== "undefined") {
         console.log("foo"); // no error
    }
}
person Raynos    schedule 21.04.2011
comment
Да, я знал об этом. Наверное, я думал, что есть другое решение. Не думал, что все этим пользуются. - person JohnAllen; 21.04.2011
comment
Если еще нет более изящного способа сделать это, он должен быть. Кажется, это обычное явление в шаблонах. - person Eric the Red; 22.12.2011

Да, большинство шаблонизаторов заключают всю скомпилированную функцию шаблона в оператор with. Можно поступить иначе, приняв во внимание переменные при анализе шаблона, но я думаю, что почти все движки шаблонов используют with().

Одним из решений было бы всегда следить за тем, чтобы «информация» всегда была в объекте locals при рендеринге этого шаблона. Вы можете сделать это, явно установив для информации значение undefined или любое другое ложное значение.

var locals = { info: undefined, ... };
person chjj    schedule 21.04.2011

просто укажите значение переменной, если переменная не определена:

input(name="company[name]" type="text",placeholder="Name",value="#{company.name || ''}")
person Rees    schedule 23.09.2015

вместо:

var params = {
    "info": [
        "a value"
    ]
};

-if(info)
  - if(info.length){
   ul
   -info.forEach(function(info){
     li= info
  -})
-}

использовать:

var params = {
    "namespace": {
        "info": [
            "a value"
        ]
    }
};


-if(namespace.info)
  - if(namespace.info.length){
   ul
   -namespace.info.forEach(function(info){
     li= info
  -})
-}

Поскольку «пространство имен» всегда будет существовать, и вы можете ссылаться на Object.key без ошибки «неопределенный», это будет работать лучше для вас.

-Джефф

person Jeff    schedule 04.04.2012