問題(これは機能します):
アプリケーションで Play 2.1.x バージョンを使用しています。私のアプリケーションには、SignIn/SignOut リンクを持つ静的なヘッダー/ツールバーがあります。すべてのテンプレートでステータス ヘッダーの HTML コードを繰り返す代わりに、main.scala.html テンプレートでそれを作成しました。SignIn/SignOut ステータスを変更するには、引数を main.scala.html に渡す必要があります。私が正しければ、これはプレイで使用するすべてのテンプレートの親テンプレートであるため、メイン テンプレートに引数を追加する場合は、インデックス、ログインなど (名前を付ける) などの子テンプレートによって提供する必要があります。
これまでのところ、トレイトに暗黙的な定義を作成し、コントローラーにこのようなトレイトを実装させることでこれを行うことができます(合成の混合...)
class ApplicationController extends Controller with ImplicitSession{
}
trait ImplicitSession {
implicit def status(implicit session: play.api.mvc.Session): Boolean = {
session.get("session") match {
case None => false
case _ => true
}
}
そして、他のすべてのコントローラーがコントローラーを再生するだけでなく、ApplicationControllerを拡張できるようにします
object LoginController extends ApplicationController{...}
今、私のテンプレートの引数は次のようになります...
メイン テンプレート
@(title: String)(content: Html)(implicit status : Boolean)
ログインのような他のテンプレート...
@(message: String)(implicit status : Boolean)
これは問題なく機能しますが、この追加の暗黙的なパラメーターをすべてのテンプレートに渡す必要があるため、解決策に満足していません
この暗黙的なパラメーターをすべての子テンプレートに渡すことを本当に避けたい
これは冗長なコードであり、実際には適切なプログラミング手法ではないと感じているためです。この概念が頭の中で明確に理解できなかったようです
また、コンパイラは Action{ implicit request =>を作成中のすべてのコントローラに配置するように強制します。そうしないと、コンパイル エラーがスローされます。
プレイバンドルで提供されているサンプルコードを確認しましたが、それらは優れていますが、フローの疑いは明確ではありません..
前もって感謝します