【问题标题】:Rendering a portion of a Play framework 2.0.2 template渲染 Play framework 2.0.2 模板的一部分
【发布时间】:2012-08-20 05:48:07
【问题描述】:

我是 Play 新手(老实说,我也是 MVC 新手)。而且我遇到了一些看起来不应该那么难的问题。

我刚刚发现了这个同名帖子:Rendering a portion of a Play framework 2.0 template

但我似乎无法正常工作。

我有一个模板(索引),其中包含另一个模板(行),我想在单击按钮时呈现该模板(索引)。 这是我的索引模板中的表格:

@form(routes.Application.getNextRows()) {<input type="submit" value="Next Rows!">}

这是getNextRows:

public static Result getNextRows() {
    return ok(views.html.tags.rows.render(rowsIterator.next()));
}

这就是我认为我遇到问题的地方,但我不知道我应该如何进行那个调用,或者我应该返回什么(没有得到一些 NullPointerException)。

这是需要重新渲染的位(在索引中):

<table cellspacing="0"  style="table-layout:fixed"  border="2">
    <col width="50%">
    <col width="45%">
    <col width="5%">
    @tags.rows(rowsIterator.first())
</table>

所以当我点击按钮时,我需要传入一个新的行元素,而不是“rowsIterator.first()” 大概我做错了什么,或者错过了一些明显的电话来解决这个问题。

感谢您的帮助(如果我明显遗漏了一些更大的概念,请随时教育我)。


查看 Zentasks 示例,我看到这样的代码,它似乎使页面的一部分重新加载。知道这是如何工作的吗?

<a class="name" href="#@routes.Tasks.index(project.id)">@project.name</a>

【问题讨论】:

  • 这是什么意思:单击按钮时我要呈现的另一个模板(行)
  • 抱歉,我有 2 个模板,一个称为索引,一个称为行。行在索引内渲染,我希望更新此渲染
  • 您有两种方法可以做到这一点:常见 - 只需使用新的 集重新加载整个页面,或使用 AJAX 仅添加新项目而不重新加载
  • 谢谢,我认为我倾向于第一个解决方案。我只需要 ajax 来完全替换我的所有行,所以认为这可能很容易(ish)。

标签: java scala playframework playframework-2.0


【解决方案1】:

很抱歉没有为您提供完整的解决方案,但恕我直言,您应该先深入了解基础知识。

您的操作方法返回整个页面,而不仅仅是其中的一部分,因为它是一个完整的 HTTP 响应。这意味着您在该操作中调用的任何内容都是您的浏览器将呈现的内容。 getNextRows 需要一个参数来查找下一行。要仅更改页面的一部分,您需要 AJAX。

单击按钮应使用下一组行重新呈现索引页面。将rows 作为参数添加到索引模板中。使用这些行调用您的行模板。

【讨论】:

  • 感谢您的回复。别担心,我并没有真正期待引用的代码或任何东西,而是指向正确的方向。我一直在阅读大量的 play 文档,但它非常难,因为有一半的时间我最终会阅读 1.x 的内容,而且文档在某些地方也可能有点薄(我发现)。再加上,这是我第一次真正使用 MVC,这意味着我正在努力寻找其中描述的许多功能的正确用途。
  • 我认为我的 getNextRows 迭代器正在工作。我实现了一个(它在模型中并从 YAML 文档加载)是不是很糟糕?如果重新渲染页面是 play 想要的,那么这就是它会得到的......
  • 此外,“Play is stateless”是什么意思?我当然可以在我的控制器中创建静态字段,并在其中存储状态,或者引用模型等并将状态存储在其中。
  • 好吧,因为我不知道你的迭代器到底做了什么,所以我不能告诉你是否正确。如果多个用户单击该按钮会发生什么?有没有做官方教程?还有一本好书:manning.com/leroux
  • 没错,状态只存在于模型中。如果您的应用部署在多台机器上,静态字段将无济于事。
【解决方案2】:

从静态字段中获取该状态的几种可能性(肯定不会很好):

  • 将所有行返回给客户端,让其在 JavaScript 中完成其余的工作(如果数据过多,则效果不佳)
  • 存储会话中最新行的编号(在 cookie 中)
  • 明确处理行号,让客户端在需要下一个时返回它
  • 执行 RESTful 分页(参见 Paging in a Rest CollectionPagination in a REST web application
  • 尝试利用分布式缓存

【讨论】:

  • 非常感谢您的回复。我去阅读了这里的会话:playframework.org/documentation/2.0.2/JavaSessionFlash,它看起来还不错,所以我想我会利用它(即使我只有一个用户)
  • 我认为您和 Marius 的解决方案相结合可以满足我的需求。尽管他在技术上直接解决了如何更改行。对不起!
猜你喜欢
  • 2012-06-24
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
相关资源
最近更新 更多