Използване на 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