包括内联或单独的AJAX调用的JSON数据?

时间:2011-05-06 05:59:16

标签: javascript ruby-on-rails ajax json

我正在开发一个网站,其中用户的“主页”页面包含一些数据供一些广泛的JavaScript代码使用。目前,数据在文档正文末尾的脚本标记中编码为JSON对象,之后实例化GUI控件对象,以便它可以访问DOM和JSON对象。我喜欢这种结构,因为它允许页面快速加载。它看起来像这样:

<body>
  <script type="text/javascript" src="mylib.js"></script>
  <div>...lots of DOM and text content...</div>
  <script type="text/javascript">
    var userData = {...}; // Encoded by HTTP response handler.
    $(document).ready(function() {
      // GUI object which modifies form controls, etc.
      new MyGuiObject(userData, document.form.myForm);
    };
  </script>
</body>

但是,新功能可能要求将userData对象作为单独的HTTP请求返回,这意味着内联表单将是重复的(并且违反了DRY principle)。重构上面的代码以便对userData使用该AJAX请求很有吸引力,但它引入了另一个HTTP请求,我们知道这些数据是我们知道的(并且可用)。

是否值得更改代码以使用从AJAX调用中检索到的userData?如果是这样,对从中检索数据的URL进行编码的最佳做法是什么(考虑到Web框架可以更好地动态生成)?

2 个答案:

答案 0 :(得分:1)

  

是否值得更改代码以使用从AJAX调用中检索到的userData?

我不会这么想,但这将是一个意见问题,在某种程度上取决于你的整体环境。这是一个判断电话。

如果你有生成对象的底层代码(无论是在初始script元素内还是以后响应ajax调用),你都没有违反DRY原则。

如果出现的HTML页面是完全静态的(因此可以缓存),那么您将重复自己,因为您必须首先在HTML中拥有该对象,然后再次使用动态响应创建它一个ajax请求。但是如果初始HTML已经动态生成,那么只需使用中心函数在两种情况下生成对象。 (该函数可以生成JSON格式的字符串,然后在HTML页面上输出前面带有var userData =的字符串,因为JSON是JavaScript对象文字格式的子集,因此您可以将其放入脚本中object literal有效。)

是否干,我不愿意向页面加载添加可避免的HTTP请求。

  

如果是这样,对从中检索数据的URL进行编码的最佳做法是什么......

我不完全确定您对URL进行编码的含义。如果您的意思是包含JSON的响应,请将其与Content-Type: application/json一起发回。在将jQuery交给success函数之前,jQuery会理解它并将其反序列化为一个对象。

答案 1 :(得分:0)

  

但是,新功能可能会   需要userData对象   作为单独的HTTP请求返回,   这意味着内联形式将是一个   重复(和违反DRY   原理)。重构很诱人   上面的代码使用那个AJAX   请求userData但它   引入了另一个HTTP请求   我们知道需要的数据(和   立即。

内联表单不一定是重复信息。它允许用户开始查看对象,并且根据您提供的额外信息,如果用户已禁用JavaScript,它可能允许您的应用程序继续工作(因为JavaScript应该只能增强应用程序,尽管我知道实际上,现代应用几乎不可能实现这一点。但是,查看表单(或表单的某些部分)的直接能力是一个优势。

因此DRY不应该意味着使某些应用程序缺乏性能或响应能力。这些目标往往处于紧张状态,但你必须达到一个快乐的中间地带。无可否认,有时易于维护可能会导致一点性能损失,但在大多数情况下,您可能不希望您的用户因此而受苦。

  

是否值得更改要使用的代码   从AJAX检索的userData   呼叫?

听起来你在上面说它将是必需的,不是吗?如果是这样,为什么需要异步接收呢?您是否从其他站点获取数据并希望尽快将内容发送给用户,然后使用其他信息更新它们?否则,为了获得最佳性能,将用户数据直接提供给用户而不是让他们等待Ajax应答可能会更好,因为Ajax最适合应用程序中稍后需要的数据,特别是在IE&lt; 8处理2个以上同时连接的限制。

如果您确实需要Ajax,也许您可​​以提供有关加载的一些信息,然后再使用其他Ajax返回的数据。

  

如果是这样,最佳做法是什么   用于编码的URL   检索数据(考虑到它   会更好地动态生成   通过网络框架)?

通过对网址进行编码,您的意思是什么?

你的意思是编码URL的字符?在核心JavaScript中,这通常使用encodeURIComponent()完成,但在jQuery中,可以使用serialize()jQuery.param()等方法为您处理,前者用于将现有表单序列化为编码的URL,后者用于将数组或对象转换为URL编码格式。

如果您的意思是在GET或POST之间做出决定,如果您的检索对服务器没有副作用,则应使用GET,而在大多数情况下,POST应该是您应该使用的。