通过JSON / AJAX更新HTML

自从我听说它以来,我一直在使用JSON来处理我的rails应用程序中的AJAXfunction,因为使用RJS /呈现HTML“感觉”错误,因为它违反了MVC。 我工作的第一个AJAX项目结果是20-30个控制器操作直接绑定到特定的UI行为,我的视图代码分布在控制器动作,部分和rjs文件上。 使用JSON允许您在视图中保持视图特定代码,并且仅通过AJAX与视图不可知/ RESTful控制器操作进行对话以获取所需数据。

我从使用纯JSON中发现的一个难题是你必须通过JS“渲染”HTML,在AJAX的情况下,必须更新DOM重元素,这可能是一个真正的痛苦。 我最终得到了长串建筑代码

// ...ajax success: function(records){ $(records).each(function(record){ var html = ('
' + record.attr + etc + ') }) }

其中等10-15行基于记录数据动态构建HTML。 除了烦恼之外,对这种方法的更严重的回归是HTML结构的重复(在模板和JS中)。*这种方法有更好的实践吗?

(我最终伸出手的动机是我现在的任务是更新HTML如此复杂,它需要两个嵌套的Ruby代码循环来渲染。在Javascript中复制它似乎很疯狂。)

  • 我考虑过的一件事是直接从文件系统加载静态部分文件,但这似乎有点多。

我喜欢模板的想法。 根据我的经验,它可以真正清理凌乱的字符串操作!

有很多解决方案,例如,查看John Resig(jQuery的创建者):

http://ejohn.org/blog/javascript-micro-templating/

我将创建一个HTML结构,其中包含您需要通过AJAX更新的元素的占位符。 它适用的结构数量取决于您要更新的内容; 如果你知道你提前拥有的元素数量,那将会产生影响

 

然后编写直接引用每个元素的id的代码,并插入.innerHTML属性(或者jquery做同样事情的语法上更多的含糖方式)。 恕我直言,必须分配每个元素的内容并不是那么可怕,你不想通过AJAX函数来分配的部分是HTML结构本身; 在您的应用中,内容仍然是易变的。

但是,看起来您可能有一个包含未知数量元素的列表,在这种情况下,您可能只需要放置一个占位符:

 

在这种情况下,我真的没有办法避免在javascript调用中构建HTML结构,但是javascript的合理分解应该有助于:

 function addArticle( headline, copy, authorInfo, i ){ createDiv( "article" + i + "Headline", headline ); createDiv( "article" + i + "Copy", copy); createDiv( "article" + i + "AuthorInfo", authorInfo ); } 

(当然不是代码,但你明白了,)

你可以在jQuery中使用load函数; 这会将页面内容加载到div中,如下所示:

 $('#content').load("content/" + this.href.split('#')[1] + ".html", '', checkResponse); 

只是做一个动态的视图,你很高兴…

恰好找到了我正在寻找的东西: Jaml