6

所以这是一个反复出现的问题,我没有找到关于 SO 的另一个例子,所以这里是:

在渲染 Jade 模板'variableName' undefined时,我什-if(variableName)至在模板中使用。

示例(我将其用作“信息”闪存消息的部分内容):

-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

4 回答 4

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
    }
}
于 2011-04-21T18:20:41.767 回答
1

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

一种解决方案是在渲染该模板时始终确保“信息”始终位于本地对象中。您可以通过将 info 显式设置为 undefined 或任何其他虚假值来做到这一点。

var locals = { info: undefined, ... };
于 2011-04-21T21:51:32.690 回答
0

只需指定变量值 IF 变量未定义:

input(name="company[name]" type="text",placeholder="Name",value="#{company.name || ''}")
于 2015-09-23T18:00:57.230 回答
-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
  -})
-}

由于“命名空间”将始终存在,并且您可以引用 Object.key 而不会出现“未定义”错误,这对您来说会更好。

-杰夫

于 2012-04-04T19:32:52.730 回答