Play框架Scala模板IF块多AND/OR条件使用及执行异常问题
问题分析与解决方案
你的问题出在Scala模板中对Map.get返回值的处理上——在Scala里,formData.get("key")返回的是Option[String]类型,而非直接的String,这导致你直接调用.equals()的比较逻辑完全错误。
修正后的代码方案
推荐使用Scala Option类型的contains方法来做条件判断,这是最简洁且安全的方式:
@(formData: Map[String, String] ) <!DOCTYPE html> <html> <head lang="sv"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>Java Play - Scala Template</title> </head> <body> @if(formData.get("nockOutRuleStatus1").contains("SUBMITTED") && formData.get("nockOutRuleStatus2").contains("APPROVED")){ <button type="button" class="btn btn-default btn-lg hide-element" id="openSuccessModalBtn" data-toggle="modal" data-target="#successModal">Success</button> } @if(formData.get("nockOutRuleStatus1").contains("REJECTED") || formData.get("nockOutRuleStatus2").contains("AUTO-REJECTED")){ <button type="button" class="btn btn-default btn-lg hide-element" id="openErrorModalBtn" data-toggle="modal" data-target="#errorModal">Error</button> } </body> </html>
其他可选方案
如果你需要处理键不存在的默认情况,可以用getOrElse提前取出值,让代码更清晰:
@(formData: Map[String, String] ) <!DOCTYPE html> <html> <head lang="sv"> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width"> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <title>Java Play - Scala Template</title> </head> <body> @val status1 = formData.getOrElse("nockOutRuleStatus1", "") @val status2 = formData.getOrElse("nockOutRuleStatus2", "") @if(status1 == "SUBMITTED" && status2 == "APPROVED"){ <button type="button" class="btn btn-default btn-lg hide-element" id="openSuccessModalBtn" data-toggle="modal" data-target="#successModal">Success</button> } @if(status1 == "REJECTED" || status2 == "AUTO-REJECTED"){ <button type="button" class="btn btn-default btn-lg hide-element" id="openErrorModalBtn" data-toggle="modal" data-target="#errorModal">Error</button> } </body> </html>
为什么原代码不生效?
在Scala中,Map.get(key)会返回Option[String]:
- 当键存在时,返回
Some("对应的值") - 当键不存在时,返回
None
你原代码中调用.equals("SUBMITTED"),本质是在比较Some("SUBMITTED")这个Option对象和字符串"SUBMITTED",两者类型完全不同,所以equals永远返回false,导致第一个if块永远不会执行。
内容的提问来源于stack exchange,提问作者Kiranmoy Pradhan
相关产品推荐
相关产品推荐

