我正在尝试使用主内容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并且只能写<div class="lift:someWidget.news">
。这将调用news
类中的someWidget
方法来呈现窗口小部件。可以在该方法中从数据库中检索数据,因此不需要预防性绑定。 Play中有类似的东西可以在控制器中保存不必要的数据库查询和不相关的代码吗?
答案 0 :(得分:5)
是。这是我首选的两个选项。正确的选择取决于您的特定用例。
选项1 - 使用@before表示法
通过使用@before注释,您可以对调用的每个操作执行常见处理。它将在执行主操作之前执行该方法,允许您将数据存储在renderArgs
地图中,该地图在视图中可用。
然后,可以在主模板中访问视图中的此数据,因此可在所有视图中使用。
选项2 - 使用AJAX
将一些div作为占位符放在您的示例中,然后使用将在服务器端调用操作的JQuery加载,为您需要的代码段生成一小段HTML。
答案 1 :(得分: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表示,则不使用布局侧边栏 - 因此数据使用此模式时不会获取。
答案 2 :(得分:0)
如果您希望每页有不同的小部件,则可以使用get / set模板标记
#{get 'moreWidgets' /}
http://www.playframework.org/documentation/1.1/tags#set http://www.playframework.org/documentation/1.1/tags#get