【问题标题】:Play Framework 2.x access variable in parent layout在父布局中播放 Framework 2.x 访问变量
【发布时间】:2017-07-28 16:38:46
【问题描述】:

下面是一个简单的 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 继承的子模板中,是否有任何方法可以访问此“用户”变量而无需重复进行相同的 @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>
    }

}

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

感谢您的任何建议。

【问题讨论】:

    标签: playframework playframework-2.0


    【解决方案1】:

    您可以考虑使用 scala implicit 吗?

    你可以从你的控制器中定义

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

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

    ma​​in.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 中声明 (implicit fooTitle: String),那么我必须在呈现此视图的 Java 控制器方法中为 fooTitle 传递一个值。每个使用 main 作为父视图的后续视图现在必须在其中声明 (implicit fooTitle: String) 才能使用 @fooTitle。我刚刚测试过这行得通。我不确定我是否获得任何东西,因为我可以取消隐式并将 fooTitle 传递到每个子视图中,例如当我在主视图中渲染时... @views.html.employee.list._table(model, fooTitle )。
    • 感谢您的回复和建议。我会更多地考虑这个作为解决方案。如果我将原始示例“用户”作为隐式,我仍然需要在我的 Java 服务器代码中获取“用户”并将其传递到我的渲染方法中,以使用我的 main.scala.html 视图。如果我仍然必须传递它,并且我仍然需要添加对每个子视图模板的引用,我想现在我没有看到隐式对我所做的事情,而我无法通过仅传递“用户”对象来做到这一点没有隐含的。不过,您让我想到了一个不同的解决方案,所以谢谢。
    • 使用隐式你不必显式地将user 传递给每个模板。还有一些需要考虑的事情,在你的控制器中你可以定义一个隐式方法implicit def getUser: User = userProvider.getSession() 然后你也不必在控制器方法中定义隐式用户——但是你必须确定提供@的最佳方法987654328@ 在范围内。很高兴我在某种程度上提供了帮助,祝你好运
    • 最好的办法可能是使用play action builder来修改提供给用户的请求,像这样:playframework.com/documentation/2.5.x/…
    • 我正在使用隐式方法来解决我的问题。这就像视图的依赖注入。我可以继续将变量从一个视图传递到另一个视图,但我喜欢隐式方法。我创建了一个包含用户特定数据和访问器的视图模型对象。感谢您的建议。
    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    相关资源
    最近更新 更多