在Jade视图中使用javascript代码 - if(variable)显示undefined而不是传递

时间:2011-04-21 18:12:28

标签: templates node.js partials express pug

所以这是一个反复出现的问题,并且没有在SO上找到另一个例子,所以这里有:

在渲染Jade模板时,即使在模板中使用'variableName' undefined,我也会获得-if(variableName)

示例(我将其用作'信息'flash消息的部分内容):

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

如果没有flash / info消息,则返回'info'而不是定义任何内容。有谁知道我做错了什么?

我知道上面提到的typeof(variable) != 'undefined选项。如果我想做-if (typeof(req.session.user) != 'undefined')之类的事情,我将不得不做3个嵌套`if(typeof(req)!='undefined'。这是我唯一的选择吗?

4 个答案:

答案 0 :(得分:10)

尝试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 :(得分:1)

是的,大多数模板引擎将整个编译模板函数包装在with语句中。通过在解析模板时考虑变量可以做到这一点,但我认为几乎所有的模板引擎都使用()。

一种解决方案是在渲染该模板时始终确保“信息”始终>本地对象。您可以通过将info显式设置为undefined或任何其他falsey值来完成此操作。

var locals = { info: undefined, ... };

答案 2 :(得分:0)

只需指定变量值IF变量undefined:

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

答案 3 :(得分:-1)

而不是:

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
  -})
-}

由于“namespace”将始终存在,并且您可以引用Object.key而不会出现“undefined”错误,因此这将更适合您。

-Jeff