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