【问题标题】:Rendering the Sidebar using the Play Framework使用 Play 框架渲染侧边栏
【发布时间】:2012-01-16 19:31:04
【问题描述】:

我正在尝试使用主要内容 div 和带有 Play framework 的侧边栏构建一个通用页面布局:

<html>
<head></head>
<body>
<div id="all">
  <div id="content">the ususal doLayout stuff</div>
  <div id="sidebar">
     <div class="widget">Recent comments...</div>
     <div class="widget">Recent posts...</div>
     other Widgets...
  </div>
</div>
</body>
</html>

是否可以在没有预防性绑定每个控制器中的小部件内容的情况下在侧边栏中呈现小部件?即使模板中没有这样的小部件,我也必须获取所需的所有数据。

我最近使用了Lift Framework,只能写&lt;div class="lift:someWidget.news"&gt;。这会调用someWidget 类中的news 方法来呈现小部件。可以使用该方法从数据库中检索数据,因此不需要预防性绑定。 Play中是否有类似的东西可以在控制器中保存不必要的数据库查询和不相关的代码?

【问题讨论】:

    标签: playframework


    【解决方案1】:

    是的。这是我首选的两个选项。正确的选择取决于您的特定用例。

    选项 1 - 使用 @before 表示法

    通过使用@before 注释,您可以对调用的每个操作执行通用处理。它将在执行主要操作之前执行该方法,允许您将数据存储在视图中可用的renderArgs 映射中。

    然后可以在主模板中访问视图中的这些数据,因此可以在所有视图中使用。

    选项 2 - 使用 AJAX

    像您在示例中所做的那样,将一些 div 作为占位符,然后使用 JQuery 加载,该加载将在您的服务器端调用一个操作,为您需要的 sn-p 生成一小段 HTML。

    【讨论】:

      【解决方案2】:

      您可以从模板调用静态控制器方法。注意 @Util - Annotation 告诉 Play 这不是一个动作 - 方法:

      @Util
      public static List<Post> getPosts() { 
          ... 
      }
      

      然后从您的模板中调用它(可能是自定义标签):

      <div class="widget">
      %{ 
          def posts=controllers.Post.getPosts()
      
          for(post in posts) { 
          }%
              <h2>${post.header}</h2>
              <p>${post.body}</p>
          %{ 
          } 
      }% 
      </div>
      

      由于这违反了纯 MVC 模式,我不建议大量使用它。但明智地使用它可能是一个非常实用的解决方案。而且您在一般布局中构建侧边栏的用例是完全有效的用法(在我看来)-如果您以后决定在主要内容中提供数据的 json 表示形式,则不使用您的布局侧边栏-因此数据使用此模式时未获取。

      【讨论】:

        【解决方案3】:

        如果您希望每个页面有不同的小部件,您可以使用 get/set 模板标签

          #{get 'moreWidgets' /}
        

        http://www.playframework.org/documentation/1.1/tags#set http://www.playframework.org/documentation/1.1/tags#get

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-02-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多