我正在尝试构建一个带有主内容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">。这将调用someWidget类中的news方法来呈现小部件。可以使用该方法从数据库中检索数据,因此不需要预防性绑定。有没有类似的东西可以在控制器中保存不必要的数据库查询和不相关的代码?
发布于 2012-01-17 04:58:13
是。以下是我首选的两个选项。正确的选择取决于您的特定用例。
选项1-使用@before符号
通过使用@before注释,您可以对调用的每个操作执行公共处理。它将在执行main操作之前执行该方法,允许您将数据存储在视图中可用的renderArgs映射中。
然后可以在主模板中访问视图中的这些数据,因此可以在所有视图中使用这些数据。
选项2-使用AJAX
将一些div作为占位符,就像您在示例中所做的那样,然后使用HTML,它将在您的服务器端调用一个操作,为您需要的代码片段生成一小段JQuery。
发布于 2012-01-17 16:56:35
您可以从模板调用静态控制器方法。注意@Util - Annotation告诉Play这不是一个action - method:
@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表示,则不会使用布局侧边栏-因此在使用此模式时不会获取数据。
发布于 2012-01-18 16:41:44
如果您希望每个页面具有不同的小部件,则可以使用get/set模板标记
#{get 'moreWidgets' /}http://www.playframework.org/documentation/1.1/tags#set http://www.playframework.org/documentation/1.1/tags#get
https://stackoverflow.com/questions/8885276
复制相似问题