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

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

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

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

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

Возвращает 'info' не определено, вместо того, чтобы ничего не отображать, когда нет flash / info-сообщения. Кто-нибудь знает, что я делаю не так?

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

Ответы [ 4 ]

10 голосов
/ 21 апреля 2011

try 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
    }
}
1 голос
/ 22 апреля 2011

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

Одним из решений было бы всегда убедиться, что "info" всегда в объекте localals при рендеринге этого шаблона. Вы можете сделать это, явно установив для info значение undefined или любое другое значение Falsey.

var locals = { info: undefined, ... };
0 голосов
/ 23 сентября 2015

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

input(name="company[name]" type="text",placeholder="Name",value="#{company.name || ''}")
0 голосов
/ 04 апреля 2012

вместо:

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 без ошибки «undefined», это будетработать лучше для вас.

-jeff

...