Scala模板中的HTML属性

ani*_*dhc 1 scala playframework-2.0 scala-template

我是一名Java开发人员,最近开始学习Play框架。我一直在尝试使以下模板正常工作,但似乎无法实现。我的Scala模板中包含以下内容

@navItem(label: String, link1: String) = {
    @{if (Application.isAuthenticated()) {
    <li class="active">
        <a href="@link1">label</a>
    </li>
    }
    else {
    <li class="disabled">
        <a href="@link1">{label}</a>
    </li>
    }
    }
}
Run Code Online (Sandbox Code Playgroud)

我稍后会在我的模板中这样称呼它

<ul class="nav">
@navItem("Search Documents", "/search")
</ul>
Run Code Online (Sandbox Code Playgroud)

生成的链接具有href localhost:9000/@link1而不是localhost:9000/search。我不确定发生了什么。

PS:如果我按以下方式更改模板,则效果很好。但是我想了解为什么上面的模板不起作用。

@navItem(label: String, link1: String) = {
    <li class="@(if (Application.isAuthenticated()) "active" else "disabled")">
        <a href="@link">@label</a>
    </li>
}
Run Code Online (Sandbox Code Playgroud)

Fyn*_*ynn 6

对此不太确定,但我的猜测可能是:@{ ... }表示动态语句的开始,其所有内容均视为Scala代码。因此,这是一个正常的if条件,结果是两个字符串,两个字符串都简单地返回到模板中。

您为什么仍将其标记为多行代码块?你有这样尝试过吗?(请注意第二个@符号后缺少的花括号):

@navItem(label: String, link1: String) = {
  @if(Application.isAuthenticated()) {
    <li class="active">
      <a href="@link1">@label</a>
    </li>
  } else {
    <li class="disabled">
      <a href="@link1">@label</a>
    </li>
  }
}
Run Code Online (Sandbox Code Playgroud)