2016-02-11 89 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

相關問題