2011-12-17 84 views
6

我想知道在Web应用程序中渲染部分视图的好方法(或推荐的方法)是什么。在服务器上渲染部分视图或在客户端上发送json数据和渲染模板

我有一个需求,我需要使用AJAX将数据加载到已经呈现的页面,有点像“加载更多...”链接在页面的末尾,从服务器获取更多信息,将其呈现在页面的底部。

两个选项,我摆弄目前的Ajax响应是

  1. 返回数据的JSON表示,并使用客户端模板库(例如jQuery的模板)或只是简单的JavaScript将JSON转换为HTML并追加到页面底部
  2. 在服务器上渲染局部视图(在我的情况下,使用grails'render template:'tmplt_name')并通过网络发送它,并将结果追加到页面底部

是否有其他方法可以做到这一点?如果不是,考虑到上述选项在维护,性能和可测试性方面会更好?我确信的一件事情是,JSON路由将(在大多数情况下)使用更少的带宽,而不是通过网络发送html。

+0

我想你已经在用户与页面的第一次联系时呈现类似的内容,就像你打算使用“加载更多链接”一样。在以相同的方式点击“加载更多”之后加载正在加载的内容并重新使用已经为此编写的代码是否没有意义?你的问题很有趣,我想看看你的想法和其他人的想法是什么 – jcage 2011-12-17 18:53:47

+0

是的,在第一次互动时,我重新使用相同的模板(点2)来渲染整个页面(与其他页面的静态部分)。这两个选项都适用于我,我已经将它们用于分散的事情。我也很想看到其他人的想法。 – omarello 2011-12-17 19:15:27

回答

2

这实际上是一个非常有趣的问题,因为它暴露了一些有趣的设计决策。

我更喜欢渲染部分模板,因为它使我的应用程序能够随时间变化。如果我需要使用图表从<table>更改为<div>,可以很容易地将其封装在模板中。考虑到这一点,我几乎将每个页面视为许多小模板的集合,这些小模板可能会发生变化。 Grails 2.0的默认脚手架已经转向这种类型的方法,这是一个好主意。

问题是它们应该是客户端模板还是服务器端是问题的关键。

服务器端模板使初始页面加载时标记更清晰。即使你使用类似的ICanHazJS,你也有点儿需要在页面中有一个空的元素(与你的模板有关),适当地设计它,然后在Javascript中使用它来更新你的信息。

缺点

通过线路
  • “健谈的” 应用
  • 较大信封(应答包括HTML,其可被认为是静态的)
  • 较慢UI响应时间

优点

  • 好fo r有很多服务器端语言体验的人
  • 也许更容易在服务器端环境中进行操作或修改(例如,返回嵌有多个模板,这是程序加载并包含一个网页)
  • 保留了大部分应用的东西“在一个地方”

客户端模板可以真正降低服务器负载,但是。他们使应用程序“less-chatty”,因为你可以通过发送更大的JSON集合(以相同的字节数或更少的数量,将被HTML占用一个服务器端模板方案)。他们还为用户提供真正快速的UI体验,因为点击“更新”链接无需进行AJAX往返。有人说:

安东尼·艾登@aeden 12月10日回复转推收藏·打开 Web应用的未来:请求由函数处理,逻辑始终是异步的,HTML是从来没有在服务器上生成。

缺点

  • 没有伟大的搜索引擎优化(在初始页面加载未语义无关的UI元素)
  • 需要一些JavaScript富(操纵元素)

优势 - 响应 - 较小的信封

趋势s似乎正在转向客户端模板,尤其是随着HTML5新增功能(如<canvas>)所暴露的威力......但如果利用它们,则需要您依赖您不太熟悉的技术,并且您对Grails感到更加舒适部分,可能值得从这些开始,然后根据性能和其他问题调查​​对客户端模板的重构。

0
在我看来

第二个选项渲染部分更好,因为如果你得到一个JSON数据,你应该只后你操纵它就像一套风格,创建元素,设定值和类似的事情按需要在javascript中获得ajax响应,但如果渲染部分内容,则可以在该部分中设计视图并保持就绪状态,并使用ajax调用进行导入,因此不存在处理响应数据的责任。

0

我想说这取决于您在放置时通过电线发送多少数据。如果你正在实现“加载更多”功能,那么你似乎不想花5秒钟来加载一些东西。 Google图像是该功能应该如此快速的一个很好的例子。如果你知道你永远不会有这么多的数据,那么渲染服务器上的部分可能会更清晰,但如果你需要改变,那么回到第一种方法是一件麻烦事。所以简而言之,我认为第一种方法允许更多的灾难控制,只要多加载更多的时间来加载大量的数据。我认为,尽可能在服务器上卸载服务器也是一种很好的做法,即使在开发人员的客户端有点不方便。

+0

这些数据大多是一些水处理样品的简单文本值。除非用户需要,否则负载基本上会抓取一些与首次交互无关的互补历史数据。为了减轻服务器的负担,我认为通过对部分模板进行适当的缓存,这不应该成为问题吗? – omarello 2011-12-17 19:26:22