Play / Scala中的隐式参数和组合视图

时间:2015-06-12 19:15:55

标签: scala playframework-2.4

这个问题建立在我发现here

的案例的基础上

index.scala.html

@(text: String)(implicit messages: Messages)

@main("Fancy title") {
  <h1>@messages("header.index")</h1>
  <div>@text</div>
}

main.scala.html

@(title: String)(content: Html)(implicit messages: Messages)
  <html>
  <head>
    <title>@title</title>
  </head>
  <body>
    <h1>@messages("header.main")</h1>
    @content
  <body>
</html>

在此示例中,我有索引,主叫主要,我希望两者都能访问消息

编译器在索引中给了我“找不到参数消息的隐含值:play.api.i18n.Messages ”但是如果我删除了隐式参数声明从主要然后索引工作正常并获取消息。似乎编译器告诉我它不知道如何将隐式参数传递给该行。

在尝试使用变通方法之前,我想了解为什么这不起作用。

3 个答案:

答案 0 :(得分:1)

在Play 2.4中,您需要在控制器中注入MessageAPI并在操作中调用首选菜单来创建消息。 如果你在行动中将其定义为隐含的。一切都会奏效。

答案 1 :(得分:1)

首先让我添加控制器的代码,以使我的原始示例更清晰。

Application.scala(原创)

class Application @Inject() (val messagesApi: MessagesApi) extends Controller with I18nSupport { 
   def index = Action { implicit request => 
      Ok(views.html.index("blah bla blah")) 
}

在更详细地研究了Play Framework文档(here)之后,我了解了从模板中访问消息的替代方法(也可能更清晰)。

Application.scala(新)

class Application extends Controller { 
   def index = Action {
      Ok(views.html.index("blah bla blah"))
   }
}

index.scala.html(新)

@import play.i18n._
@(text: String)
@main("Fancy title") {
  <h1>@Messages.get("header.index")</h1>
  <div>@text</div>
}

main.scala.html(新)

@import play.i18n._
@(title: String)(content: Html)
  <html>
    <head>
      <title>@title</title>
    </head>
    <body>
      <h1>@Messages.get("header.main")</h1>
      @content
    <body>
  </html>

控制器不再需要所有额外的基础设施。

视图需要添加一个import语句,但会丢失隐式参数声明。

使用@Messages.get("xyz")代替@Messages("xyz")来访问消息。

目前这种方法符合我的需要。

答案 2 :(得分:0)

播放框架会将您的请求隐式转换为您的视图的MessagesApi。但是,您确实需要在控制器方法中包含request =>隐式参数。还要在控制器中包含I18nSupport特性。

import play.api.i18n.{MessagesApi, I18nSupport}

@Singleton
class HomeController @Inject() (cc: ControllerComponents)
extends AbstractController(cc) with I18nSupport {

  def showIndex = Action { implicit request =>
    Ok(views.html.index("All the langs"))
  }
}