【问题标题】:How to inject Scala variable into html attribute (String) in Scala template HTML如何将 Scala 变量注入 Scala 模板 HTML 中的 html 属性(字符串)
【发布时间】:2015-09-24 12:51:06
【问题描述】:

让我解释一下我的要求。目前我们正在使用具有一些 html 代码和 Scala 属性的 Scala 模板。

示例test.scala.html

@(hostName: String, token: String, protocol: String, supportEmail: String)
@import helper._
<!DOCTYPE html>

<html>
<head>
    <title></title>    
</head>
<table>
<tr>
            <td>&nbsp;</td>
            <td style="color: #626262;">                
                <p style="font-size:14px;">
                    <br/>
                    Our app will let you access your company intranet.<br/><br/>
                    Your activation code is <b>@token</b><br/><br/>

                    If you have any questions, please contact our <a href="mailto:@supportEmail">support team</a> anytime.
                    <br/><br/>
                    Best regards,<br/>
                       The Support Team
                    </p>
                </td>
            </tr>
        </table>
    </body>

如果您看到上面的代码 @token@supportEmail 是动态的,我们正在传递给 Scala。

到目前为止看起来不错。需求发生变化,客户现在希望我们从数据库中读取内容。他们想要保存实际的 html 内容(table ... end of table)。

所以我获取了代码并将其存储在数据库列中。我可以使用@Html 将此内容传递给我的视图函数。

现在我的新 Scala 视图函数如下所示:

@(hostName: String, token:String, protocol: String, supportEmail: String, content: String)
@import helper._
<!DOCTYPE html>

<html>
<head>
    <title></title>    
</head>
 @Html(content) 

但我无法动态传递@token@supportEmail。它被视为纯字符串。渲染后如下图:

我们的应用程序可让您从您的设备访问您公司的 Intranet、文件和 SaaS 服务。

您的激活码是@token

如果您有任何问题,请随时联系我们的支持团队@supportEmail。

最好的问候,
支持团队

谁能解释一下@Html 有什么问题,我可以解析动态内容吗?如果没有,还有其他选择。

【问题讨论】:

    标签: java html scala playframework


    【解决方案1】:

    @Html 函数允许您从变量中插入 HTML 片段,而无需转义特殊字符,例如 &lt;&gt;。但是,它只适用于静态 HTML,不幸的是,它不能解析其中的额外 Scala 代码。

    在您的情况下,满足您的要求的最简单方法是在将内容传递给视图之前在控制器中准备内容。控制器方法中的代码或多或少看起来像这样:

    public Result showContent() {
        //fetching all your data here
        content = content.replace("@token", token);
        content = content.replace("@supportEmail", supportEmail);
        return ok(views.html.test.render(hostName, protocol, content));
    }
    

    基本上,您不必在表格内容中使用 Twirl 占位符。如何在内容中标记可替换参数由您决定。只需确保 replace 调用与您的模式匹配即可。

    我假设 tokensupportEmail 没有在视图的其他位置使用,因此我将它们从视图的标题中删除。

    @(hostName: String, protocol: String, content: String)
    

    简单的解决方案通常是最好的解决方案:)

    【讨论】:

    • 即使我想到了相同的解决方案,但想检查我是否可以使用 Scala 的任何其他替代方案来传递动态参数。现在我开始使用您建议的解决方案实施
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2011-09-08
    • 2020-04-17
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多