2016-02-11 105 views
0

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

有没有办法解决这个问题?将它传递到任何地方都意味着我必须在任何地方都可以使用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> 

回答

1

在这里,我看到两个变通。不幸的是,我现在无法测试它们,但我相信它们都可以工作。

  1. 摆脱表格模板中的messages参数。使用Play.current.injector.instanceOf[MessagesApi]即可在模板(here is a question about accessing injector without an @Inject annotation)内获得MessagesApi实现。然后你可以调用方法preferred(Http.RequestHeader request):Messages得到一个Messages实例,然后你需要明确地将它传递给一个辅助方法。
  2. 如果您只想摆脱注射,并且您不介意将隐式messages参数传递给每个模板,则可以实现您自己的I18nSupport特性版本。这里我的意思是说你通常用以下方式编写控制器: class SomeController @Inject()(val messagesApi: MessagesApi) extends Controller with I18nSupport。该值覆盖I18nSupport特征的相同值。你可以用你自己的MyI18Support这个特性来扩展这个特征,并且在里面注入MessagesApi(UPD:你可以是@Iinject或者使用Play.current.injector)。那么你将只需要编写控制器如下:class SomeController extends Controller with MyI18nSupport
+0

我跌倒了这两个解决方案都有些不妥。可能是问题会出现在性能或测试中,而我在DI方面没有经验可言。 –

+0

我会对它们进行测试。 – Haito

+0

确实有这么长时间的浪费。我们实施了第一个解决方案。它的工作原理。非常感谢你。 – Haito