我是Scala和Play的新手,我正在使用main.scala.html页面-在我的理解中,它被用作单页应用程序(SPA)框架。我希望这是一个正确的说法。
我正在尝试切换链接/文本从登录到注销,基于与应用程序设置的会话变量。由于某些原因,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()函数:函数isLoggedIn() {
var email = '<%= Session["email"] %>';
if (email != null || email != "") {
return true;
}
else {
return false;
}
}
我知道电子邮件会话变量已经设置——它不是空的,所以代码应该可以工作。
是否有某种"刷新"的问题与主要。scala.html?或者Scala不作为SPA框架?
谢谢你的帮助。
谢谢!丹
在模板声明中,您将isLoggedIn
声明为String。但是您试图在if表达式中使用它作为布尔值。
还有你的if条件是错误的。当isLoggedIn
为true时显示登录
@if(isLoggedIn) {
<li class="scroll_btn"><a href="/auth">Login</a></li>
} else {
<li class="scroll_btn"><a href="/logout">Logout</a></li>
}
播放模板不是默认的SPA。你可以通过添加AngularJS或你喜欢的JavaScript SPA框架来实现。当提供页面时,所有以@开头的内容都会在服务器端求值(并替换)一次。所以你的JavaScript语句@isLoggedIn = isLoggedIn();
,如果你在浏览器中检查它,可能看起来像true = isLoggedIn();
甚至= isLoggedIn();
(如果例如,isLoggedIn变量恰好是空白的)。
如果像@pamu建议的那样,您将其更改为布尔值,而不是字符串,那么您的模板代码可以执行一次性检查(计算/替换只发生一次),以按照建议的行生成。
如果你想要一些更动态的东西,也就是说,不想为了做出改变而加载整个页面,那么你将不得不考虑JavaScript和前端的SPA框架。