【问题标题】:How to implement widgets on PlayFramework2?如何在 PlayFramework2 上实现小部件?
【发布时间】:2012-07-12 17:55:35
【问题描述】:

问题

如何实现一个小部件(由数据库调用产生)出现在网站的每个页面上?

上下文

我有一个带有侧边栏的传统 Web 应用程序。侧边栏包含以下数据:

  • 用户名,
  • 有关帐户的详细信息(上次连接和其他)
  • 基于用户资料的个性化消息。
  • 以及从数据库中提取的其他数据。

目前的解决方案

如官方文档所示,可以在模板内渲染模板。这是一个有趣的功能,但还不够。因为我需要将数据库中的数据呈现在我的小部件中。

这意味着:

  1. 在某处获取侧边栏所需的所有数据,
  2. 将数据从每个控制器传递到每个视图,
  3. 最后在每个模板中,使用给定的数据调用一个外部模板。

我想做的是 Symfony2 框架中存在的东西。我希望能够直接调用控制器。

{% render MyController:MyActionMethod %}

如何实现这种机制?

PS:是的,我已经搜索了一下。发现这个问题“类似问题”:How to avoid passing parameters everywhere in play2?

【问题讨论】:

    标签: model-view-controller widget playframework-2.0


    【解决方案1】:

    您首先描述了两种解决方案 - 将来自控制器的数据作为某种对象传递,然后使用 tags 进行渲染。

    第二种方案是逆向的,在Play 2中每个模板只是一个Scala函数,你也可以在你的控制器中调用一些方法,它会获取所需的数据并渲染子模板。

    即。从模板使用访问controllers.MyController.myMethod(Integer a, Integer b)

    <div>
      @MyController.myMethod(1,2) 
    </div>
    

    【讨论】:

    • 很酷的东西,如果它确实有效的话。我今晚会试一试。我看到这个解决方案的一个问题是我需要这个请求。意思是,我必须在所有模板上传递请求。
    • request 隐含在所有模板中(即直接可用)
    【解决方案2】:

    您可以在控制器中编写静态方法,该方法返回 play.api.templates.Html(或 play.mvc.Content)而不是 Result。

    public static Content widget() {
    
       Data fetchedData = fetchDataFromTheDatabase();
    
       return views.html.widget.render(fetchedData);
    }
    

    在您看来,只需调用此静态方法即可。

    【讨论】:

      猜你喜欢
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-27
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多