播放字符串的scala模板语法

时间:2016-04-06 22:39:22

标签: html scala playframework playframework-2.0

我正在尝试使用scala参数来驱动此html锚标记的href属性,并且似乎无法使其工作。

@{
    val key = p.getKey()
    if(key == "facebook") {
     <a href="/authenticate/@(key)">Sign in with facebook</a>
    } else if (key == "twitter"){
     <a href="/authenticate/{key}">
        <span>Sign in with twitter {key} (this works)</span>
     </a>
    }    
}

在两个示例中,href属性都没有正确生成,但是当我在html属性之外的span标记中使用{key}时,它会正确打印出密钥。

1 个答案:

答案 0 :(得分:1)

Twirl不支持else-if。由于这会给你带来问题,你将它包装在一个动态块@{}中,我认为你可以开展工作(从未尝试过)。然而,这并不是通常的事情,而是首选使用模式匹配。

以下是您的代码的外观:

@p.getKey() match {
    case "facebook" => {
        <a href="/authenticate/@{p.getKey()}">Sign in with facebook</a>
    }
    case "twitter" => {
        <a href="/authenticate/@{p.getKey()}">
            <span>Sign in with twitter - key @{p.getKey()} </span>
        </a>
    }
}

现在可行,但您也可以使用defining(而不是val)定义可重用的范围值,以减少p.getKey和href本身的重复:

@defining(p.getKey()) { key =>
    @defining(s"/authentication/$key") { href =>
        @key match {
            case "facebook" => {
                <a href="@href">Sign in with facebook</a>
            }
            case "twitter" => {
                <a href="@href"> <span>Sign in with twitter - key @key</span> </a>
            }
        }
    }
}

当假设消息完全相同时,除了键变得更容易之外,废弃模式匹配和href定义(因为它只使用了一次):

@defining(p.getKey()) { key =>
    <a href="/authentication/@key">Sign in with @key</a>
}