【问题标题】:Scala/Play how to update main.scala.html HTML to show/hide textScala/Play 如何更新 main.scala.html HTML 以显示/隐藏文本
【发布时间】:2017-03-07 17:39:45
【问题描述】:

我是 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;
}
}

我知道电子邮件会话变量已设置——它不为空,所以代码应该可以工作。

main.scala.html 是否存在某种“刷新”问题?还是 Scala 不能作为 SPA 框架发挥作用?

感谢您的帮助。

谢谢! 丹

【问题讨论】:

    标签: javascript html scala playframework


    【解决方案1】:

    在模板声明中,您将isLoggedIn 声明为字符串。但是您正试图在 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>
    }
    

    【讨论】:

    • 进行了更改以处理字符串 - 仍然无法识别该变量。我猜想在该 .html 页面中显示新的
      时 main.scala.html 没有更新。似乎 Javascript 没有“触发”。
    • 看起来像一行代码 -- var email = ''; -- 返回值 '',而不是变量本身的值。
    【解决方案2】:

    播放模板默认不是 SPA。您可以通过添加 AngularJS 或您最喜欢的 JavaScript SPA 框架来实现它们。以 @ 开头的所有内容都在服务器端被评估(和替换)一次,当页面被提供时。所以你的 JavaScript 语句 @isLoggedIn = isLoggedIn();,如果你在浏览器中检查它,可能看起来像 true = isLoggedIn(); 甚至 = isLoggedIn();(例如,isLoggedIn 变量恰好是空白)。

    如果像@pamu 建议的那样,您将其更改为布尔值,而不是字符串,那么您的模板代码可以执行一次性检查(评估/替换只发生一次)以按照建议的方式生成。

    如果您想要更动态的东西,即不想加载整个页面来进行更改,那么您将不得不在前端使用 JavaScript 和 SPA 框架。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多