我是Scala和Play的新手,并且正在使用main.scala.html页面 - 在我的理解中,它被用作单页面应用程序(SPA)框架。我希望这是一个正确的陈述。
我正在尝试根据使用应用程序设置的会话变量将链接/文本从Login切换到Logout。出于某种原因,main.scala.html页面将无法识别此变量,即使它已更改。
这是main.scala.html代码摘录:
@(user: User = null, scripts: Html = Html(""), isLoggedIn: String = "")(content: Html)
<!DOCTYPE html>
<html>
<head>
...
<script type="text/javascript">
@isLoggedIn = isLoggedIn();
</script>
</head>
<body>
...
<div class="pull-right">
<nav class="navmenu center">
<ul>
<li class="scroll_btn"><a href="/">Home</a></li>
<li class="scroll_btn"><a href="/signup">Register</a></li>
@if(isLoggedIn == true) {
<li class="scroll_btn"><a href="/logout">Logout</a></li>
} else {
<li class="scroll_btn"><a href="/auth">Login</a></li>
}
</ul>
</nav>
</div>
...
</body>
</html>
这是isLoggedIn()函数: function isLoggedIn(){
var email = '<%= Session["email"] %>';
if (email != null || email != "") {
return true;
}
else {
return false;
}
}
我知道电子邮件会话变量已设置 - 它不为空,因此代码应该有效。
main.scala.html是否存在某种“刷新”问题?或者Scala不能作为SPA框架运行?
我感谢任何帮助。
谢谢! 丹
答案 0 :(得分:0)
在模板声明中,您将isLoggedIn
声明为String。但是你试图在if表达式中使用它作为布尔值。
你的if条件也错了。 isLoggedIn
为真时显示登录信息。
@if(isLoggedIn) {
<li class="scroll_btn"><a href="/auth">Login</a></li>
} else {
<li class="scroll_btn"><a href="/logout">Logout</a></li>
}
答案 1 :(得分:0)
播放模板默认情况下不是SPA。你可以通过添加AngularJS或你最喜欢的JavaScript SPA框架来实现它们。在服务页面时,在服务器端评估(和替换)以@开头的所有内容。因此,如果您在浏览器中检查它,您的JavaScript语句@isLoggedIn = isLoggedIn();
可能看起来像true = isLoggedIn();
甚至= isLoggedIn();
(例如,如果isLoggedIn变量恰好是空白的话)。
如果像@pamu建议的那样,你将它改为布尔值而不是字符串,那么你的模板代码可以进行一次性检查(评估/替换只发生一次),以便按照建议的方式生成。
如果你想要更动态的东西,即不想加载整个页面以进行更改,那么你将不得不在前端寻找JavaScript和SPA框架。