在Jade视图中使用JavaScript代码 - 如果(变量)显示未定义而不是通过

6

我经常遇到一个问题,但在SO上没有找到其他例子,所以我来解释一下:

当渲染Jade模板时,即使在模板中使用了-if(variableName),我仍然会收到'variableName' undefined的错误提示。

以下是一个示例(我将其用作“info”闪存消息的部分):

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

这会返回“info未定义”,而不是在没有闪存/信息消息时不渲染任何内容。有人知道我做错了什么吗?
我知道可以使用typeof(variable) != 'undefined'选项。如果我想做类似-if (typeof(req.session.user) != 'undefined')的事情,我必须进行3个嵌套的`if (typeof(req) != 'undefined'。这是我的唯一选择吗?

注意:函数(info)中传递的“info”(作为参数名)与您在if语句中使用的“info”完全不同。 这不会解决问题,但它会使代码更易读。 - timoxley
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
    }
}

1
是的,我知道。我想我以为还有其他解决方案。没想到每个人都在使用那个。 - JohnAllen
4
如果还没有更简单的方法,那么应该有一个。这似乎是模板中经常发生的事情。 - Eric the Red

1

是的,大多数模板引擎都会在整个编译后的模板函数中使用with语句。当解析模板时,也可以通过考虑变量来进行其他操作,但我认为几乎所有的模板引擎都使用with()。

一种解决方案是始终确保在呈现该模板时,“info”始终在本地对象中。您可以通过将info明确设置为未定义或任何其他falsey值来实现此目的。

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

0

如果变量未定义,只需简单指定变量的值:

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

-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而不会出现“未定义”的错误,因此这对您更有效。

-jeff


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接