Scala/Play如何更新main.scala.html以显示/隐藏文本



我是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框架。

最新更新