在父布局中播放Framework 2.x访问变量

时间:2017-07-28 16:38:46

标签: playframework playframework-2.0

下面是一个简单的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>
    }

}

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

感谢您的任何建议。

1 个答案:

答案 0 :(得分:1)

你能考虑使用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 *@