Play Framework 2.x 访问父布局中的变量

Play Framework 2.x access variable in parent layout

下面是一个简单的 main.scala.html 模板。

@import services.UserProvider
@(userProvider: UserProvider)

<!DOCTYPE html>
<html lang="@lang().code()">
    <head>
    </head>

    @defining(userProvider.getUser(session())) { user =>
    <body>
        <main id="main-container">
            <div class="content">
                @content
            </div>
        </main>
    </body>
    }
</html>

我使用@defining 定义了一个用户变量。在我继承自 main.scala.html 的所有子模板中,是否有任何方法可以访问此 "user" 变量而无需进行相同的 @defining(userProvider.getUser(session()))) 调用重复(如下面的子模板所示)?

@import services.UserProvider
@(userProvider: UserProvider, model: MyModel)

@main(userProvider, model) {

    @defining(userProvider.getUser(session())) { user =>

        <div class="block-content">
            @views.html.foo.list._filter(user, model)
        </div>

        <div>
            @_showingBarPartial(user, model)
            @views.html.foo.list._table(model, user)
        </div>
    }

}

我的项目中到处都是这个代码片段,我正在尝试确定是否有必要这样做 and/or 是否会导致问题。看起来,我已经在主(父)模板中定义了一次,为什么不重用它而不是在子模板中重新获取它。

感谢您的任何建议。

您可以考虑使用 scala implicit 吗?

从你的控制器你可以定义

implicit val user: User = userProvider.getUser(session())

然后在每个模板中你会从父闭包引用隐式,诀窍是你必须通过每个模板传递对隐式的引用:

main.scala.html

@(model: MyModel)(implicit val user: User)

@main(userProvider, model) {
  <div class="block-content">
    @views.html.foo(model)
    ...

foo.scala.html

@(model: MyModel)(implicit val user: User)

  @user.name is logged in  @* <--- using the implicit in a child template *@