0

我正在使用 PlayFramework 模板进行一些工作,但遇到了问题。我们正在使用需要Messages(从 导入play.api.i18n)的 play 助手。一切都很好,直到我们的设计师想要以 Modal 形式登录表单......因为它将附加到每个模板,我们需要在任何地方添加该消息参数 - 这是丑陋的恕我直言。

有没有办法解决这个问题?到处传递它意味着我必须到处传递它Inject(),即使只需要传递它来关闭类型检查器。

示例页面:

@(project: model.Project)(implicit request: Request[AnyContent], messages: Messages)
@main(project.name){
    <h1>@project.name</h1>
    <ul>
    @for(member <- project.members) {
        <li><a href="@routes.UsersController.view(member)">@member</a></li>
    }
    </ul>
}{}

主模板片段:

@(title: String)(content: Html)(additionalImport: Any)(implicit req: Request[AnyContent], messages: Messages)

<!DOCTYPE html>

<html lang="en">
    <head>

    </head>
    <body>
        @* this call actually needs that param. *@ 
        @header.navbar()
        <div class="container">
            @req.flash.get("error").map { error =>
                <div class="flash-error">@error</div>
            }
            @content

        </div>
    </body>
</html>

表格:

@import model.UserLoginData
@(loginForm: Form[UserLoginData])(implicit req: Request[AnyContent], messages: Messages)
    @helper.form(action = routes.AuthenticationController.login()) {

        @loginForm.globalErrors.map { error =>
            <div class="error">@error.message</div>
        }

        @helper.inputText(loginForm("login"))

        @helper.inputPassword(loginForm("password"))

        <input type="submit" value="Zaloguj"/>
    }
    <a href="@routes.AuthenticationController.recoverForm()">Zapomniałem hasła</a>
4

1 回答 1

1

在这里,我看到了两种解决方法。不幸的是,我现在无法测试它们,但我相信它们都会起作用。

  1. messages从表单模板中删除参数。用于在模板内Play.current.injector.instanceOf[MessagesApi]获取实现(这里是关于在没有注释的情况下访问注入器的问题)。然后你可以调用该方法来获取一个实例,然后你需要显式地将它传递给一个辅助方法。MessagesApi@Injectpreferred(Http.RequestHeader request):MessagesMessages
  2. 如果您只想摆脱注入并且不介意将隐式messages参数传递给每个模板,则可以实现自己的I18nSupport特征版本。这里我的意思是你通常用以下方式编写控制器: class SomeController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport. messagesApival 覆盖特征的相同值I18nSupport。你可以用你自己的 trait 扩展这个 trait MyI18Support,并在其中注入MessagesApi(UPD:你可以使用@Iinject或者使用Play.current.injector)。然后你只需要编写控制器如下:class SomeController extends Controller with MyI18nSupport.
于 2016-02-14T08:44:16.857 回答