0

关于将通用状态传递给模板,我或多或少有一个关于理解 Play 框架的一般性问题。这是一个被广泛讨论的话题,就像这里:http: //jazzy.id.au/default/2012/10/26/passing_common_state_to_templates_in_play_framework.html 但我仍然不确定最佳实践是什么。我熟悉基于脚本语言的 MVC 框架,如 CakePHP 或 Django,所以这个问题对我来说并不重要。所以,基本上有两种可能:

  • 在模板中使用隐式变量,这仅适用于 Scala,您仍然必须在每个模板中声明该变量!?
  • 使用 Http.Context 类来存储数据,这对我来说更像是一种 hack,它不太适合传递大量数据。(如果我错了请纠正我)

对于这个问题,我有两个重要的用例。第一个是让登录的用户对象随处可用。这是使用 Http.Context 很容易解决的问题。第二个对我来说更难。我有一个标题,它要么显示登录表单,要么显示一些用户特定的选项。因此,我在模板中有一个 if 条件,检查用户是否登录。但是当我显示登录表单时,我需要在控制器中生成表单对象。因此,我必须在每个控制器中生成该对象并将其传递给每个模板,尽管我只在没有用户登录时才需要它。我确定 Play 框架的制造商是否是这样的意思。

我会很高兴有任何见解或冲动。谢谢。

4

1 回答 1

0

为了显示您的表单,您只需调用一个将创建表单并呈现模板的方法,而不仅仅是调用另一个模板。

例如,您可以有一个要显示用户信息的模板或这样的表单:

views/home.scala.html :

...
@if(user.isLoggedIn()) {
  @loggedInHeader()
} else {
  @controllers.Application.loginFormHeader()
}
...

如果用户已经登录,您只需渲染另一个模板(在这种情况下为 loggedInHeader.scala.html),否则您在控制器上调用另一个方法(但它可以在任何类型的类上):

app/controllers/Application.java :

class Application extends Controller {
  ...
  public static Html loginFormHeader() {
    Form form = Form.form(...);
    return views.html.loginFormHeader.render(form);
  }
}

此方法构造表单并使用如下模板呈现它:

views/loginFormHeader.scala.html :

@(form: Form)
...

您可以@controllers.Application.loginFormHeader()从任何您想要的模板(来自主布局模板的事件)调用该方法,并且您不需要在其他任何地方构建 Form 对象。

于 2013-06-10T10:30:51.573 回答