【问题标题】:Does Play Framework support "snippets"?Play Framework 是否支持“片段”?
【发布时间】:2011-01-25 19:09:00
【问题描述】:

如果我想在多个页面(例如菜单)中使用一个通用的 UI,推荐的方法是什么?

它将包含模板代码和后端控制器(类似于 LiftWeb 框架中的“sn-ps”)。

我知道 Play 有一个菜单模块,但我更感兴趣的是一般如何实现这一点。

【问题讨论】:

    标签: java playframework


    【解决方案1】:

    有两种方法可以将通用视图代码包含到 Play 框架中。

    您可以使用#{include} 标签或#{extends} 标签。

    extends 标签,顾名思义,是从父视图扩展而来的。在创建新应用程序时,Play 设置的骨架代码中默认使用 extends 标签。它扩展了 main.html。你在这里添加你的代码。

    includes 标记允许您在指定点将一段通用的视图代码注入模板中。这与 php include/require 或 jsp 包含工作几乎相同。

    当您的模板代码还需要来自模型的数据或逻辑(通过控制器)时,就会出现问题。如果是这种情况,那么您将需要在控制器中使用 @Before 或 @With 表示法,以确保每次都执行通用的控制器代码。您可以将任何数据添加到 renderArgs 列表中,以便在视图中使用。

    使用 renderArgs 的一个简单例子是。

    @Before
    private static void commonData() {
        // do your logic here
        renderArgs.put("menu", menu);
        renderArgs.put("selected", selectedMenuItem);
    }
    

    您放入 renderArgs(菜单并在示例中选择)的值将可用,就像您将它们传递给 render 方法一样。

    【讨论】:

    • 谢谢 - 你能指出任何使用 renderArgs 的示例代码吗?
    • @Codemwnci 我的 renderArgs{} 中出现空值/空值。成功登录后,我在 renderArgs 中存储了一个地图,并使用 renderArgs.get(login_det').toString() 在控制台中打印了所有值。当我在另一个控制器中使用相同的控制器时,我将 renderArgs 作为 {}。这可能是什么问题。
    • 是同一个动作的一部分吗?您是否使用 @Before 将数据存储在 renderArgs 中?请记住,renderArgs 仅在请求的长度内存在,因此它将在下一个请求中丢失。还要记住,如果您从一个操作中调用另一个操作,它将强制进行 HTTP 重定向,这是另一个请求,因此会重置 renderArgs。
    • @Codemwnci 我在登录期间和一个单独的函数中设置了值,该函数是
      @
      Before private static void commonData() { Map cacheMap = Cache.get("login_det ",地图.class); if(cacheMap!=null) { renderArgs.put("login_det", cacheMap); System.out.println("commonData"+renderArgs.toString()); } }
    • @Codemwnci 在我的 customersList 控制器函数中我打印了缓存和 renderArgs.toString()。 Cahce 仍有值,但 renderArgs 是 {}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    相关资源
    最近更新 更多