Javascript模板及其中的数据逻辑分离思想(MVC)
#Javascript模板及其中的数据逻辑分离思想 ##需求描述
项目数据库的题目表描述了70-120道题目,并且是会变化的,要根据数据库中的数据描述,比如,选择还是填空题,是不是重点题,题目总分是多少等等有条件地渲染出题目的内容,并且能做完后保存回数据库,打印出来。 ##以前的实现
由后台(structs2+spring+ibaties)查询,扔出JSON ,前台就是无穷无尽的if,switch。一但有要修改,就要吐血了,也不知道要改多少个地方 ##思考与改进
结合自己的[正则表达式](http://www.cnblogs.com/p2227/tag/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/)及[HTML](http://www.cnblogs.com/p2227/tag/html/)知识,我们可以定义一种规则,使得JSON与HTML进行关联,怎么样的JSON就有怎么样变化的HTML,当需求变动-->数据库变动-->生成JSON变动-->生成HTML变动,整个项目就好维护多了。于是这就形成了一套`Javascript模板`。 ##JSON数据解释
```javascript
var subject = {
"subjectAttr": "JD-SUB-3",//JD-SUB-1填空题,JD-SUB-3选择题
"remark": "",//备注
"score": "",//填空题的分数
"subjectContent": "《帱槗嘮煵僝蹣媮》逦瘞僌鰦鵾舷鶴",//题目内容
"selectTypeValue": "***",//题目重要程度,*越多越重要
"pkAnswer": "1",//JD-SUB-3类别题目的答案(单选),1选0未选
"subjectType": "SUB-AVAIL-2",//必填,SUB-AVAIL-1非必填
"pkCase": "",//JD-SUB-8类别题目的答案,结果为UUID
"td4BizAnsweritemList": [{//选择题的选项
"content": "否",//选项的正文
"id": "6BA95898E82B41DF947D14603C4743CF"//选项的CODE
},{ //另外一个选项
}]
```
##示例及代码
根据以上的JSON,我们生成对应的HTML。核心代码思想就是用正则分割数据,利用replace函数去匹配,生成HTML。

我只需要配置JSON内容中的subjectAttr属性,其表现方式就随着我的数据自然而变动,其他的逻辑就不需要再重复了 [DEMO](http://p2227.github.io/demo/jsTemplate/) [CODE](https://github.com/p2227/demo/tree/gh-pages/jsTemplate) ##自我点评
这个模板是针对项目需求及easyui组件去处理的,可能局限性比较大,效率也有问题,但是这套简单的模板提高了代码的重用性,而且使得程序的**数据**与 **控制逻辑**耦合度降低,维护性提高了很多。而这个理论再提升,就是MVC了,前端也有不少优秀的MV*(MVC,MVP,MVVM)框架,先有实践,再结合源代码去学习优秀的框架,是提升自我的常用途径。 简单地描述一下本人的JS模板的数据模型  原理是非常简单的,JSON与HTML两种不同的格式,一个抽象的控制器使得他们之间转化(主要还是JSON2HTML,HTML2JSON有现成的serialize函数)。当我突然之间想进行一些视图上的改动,例如`JD-SUB-3`选择题,不再以单选框显示,而是“是 否”两个单radio,那我只需要改动`jsParser`中的`template`即可,见`JD-SUB-31`与`JD-SUB-3`的区别。如果再有一重if/else或者switch,那么在条件中也会有很多重复的功能,用js模板能把这些功能抽象出来,从而达到**思考与改进**中的目标。
Javascript模板及其中的数据逻辑分离思想(MVC)的更多相关文章
- thymeleaf的内联th:inline(在javascript访问model中的数据)
thymeleaf模板引擎为前端数据的获取提供了较大的便利,在html标签内可通过th标签加${}表达式访问model里的对象数据.但如果不想通过th标签而是简单地访问model对象数据,或是想在ja ...
- 高性能JavaScript模板引擎原理解析
随着 web 发展,前端应用变得越来越复杂,基于后端的 javascript(Node.js) 也开始崭露头角,此时 javascript 被寄予了更大的期望,与此同时 javascript MVC ...
- 高性能JavaScript模板引擎实现原理详解
这篇文章主要介绍了JavaScript模板引擎实现原理详解,本文着重讲解artTemplate模板的实现原理,它采用预编译方式让性能有了质的飞跃,是其它知名模板引擎的25.32 倍,需要的朋友可以参考 ...
- Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整
Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...
- 各种JS模板引擎对比数据(高性能JavaScript模板引擎)
最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...
- 在 ASP.NET 中创建数据访问和业务逻辑层(转)
.NET Framework 4 当在 ASP.NET 中处理数据时,可从使用通用软件模式中受益.其中一种模式是将数据访问代码与控制数据访问或提供其他业务规则的业务逻辑代码分开.在此模式中,这两个层均 ...
- 一种数据与逻辑分离的Python单元测试工具
一种数据与逻辑分离的Python单元测试工具 几个概念 TestCase TestCase是一个完整的测试单元,最小的测试执行实体,就是我们常说的测试用例. TestSuite 以某种特性将测试用例组 ...
- NOPI读取模板导出(Excel中追加数据)
在Controller里,我们定义一个FileResult的Action,返回值是一个文件形式被浏览器下载下来. [HttpGet] public FileResult ExportProductLi ...
- JavaScript中的数据类型转换
本文中提到的“原始值”指的是undefined,null,Boolean,string和number. 本文中的对象是native对象,宿主对象(浏览器定义的对象)按照各自的算法转换. JavaScr ...
随机推荐
- js获取当前时间,js时间函数
Js获取当前日期时间及其它操作,js时间函数 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); ...
- 观察者模式最佳案例实现[JAVA][原创]
/** * American Stock Exchange market(ASE) has a list of stocks.A stock object has two perspective in ...
- js各种间距数据汇总
clientX,offsetX,screenX,pageX区别 先总结下区别: event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不 ...
- Tomcat遇到”Error listenerStart”或”Error filterStart”问题且无详细日志时的log配置.
昨天部署web应用到Tomcat之后,无法成功启动,并且控制台没有详细的错误信息,顶多就两行提示信息,例如:严重: Error listenerStart严重: Context [/lizongbo] ...
- vmware装redhat该光盘无法被挂载
为了考网工,没办法只能学学linux了,前天在vmware7装redhat 提示该光盘无法被挂载,还以为是光盘错误,换了N个盘,又装了很多次,最后观察到,换了盘之后点确定,里面就提示该光盘无法被挂载, ...
- 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息
键盘消息 Windows系统无论何时只有一个窗口(可能是子窗口,也就是控件)能获得焦点. 焦点窗口通过windows消息来响应人的键盘操作,与键盘相关的常用消息罗列如下: WM_KEYDOWN 按 ...
- HDU 3790 最短路径问题【Dijkstra】
题意:给出n个点,m条边,每条边的长度d和花费p,给出起点和终点的最短距离和花费,求最短距离,如果有多个最短距离,输出花费最少的 在用dijkstra求最短距离的时候,再用一个f[]数组保存下最少花费 ...
- VC++的菜单控制和自绘菜单
菜单控制为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 需要将CFrameWnd:: m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值), ...
- 【转】Windows Server 2008 以上服务器配置SMTP
建立 SMTP 伺服器 [除非特別說明,否則本主題中的內容適用於 BizTalk Server 2013 和 2013 R2.]原文链接:https://msdn.microsoft.com/zh-t ...
- opengl截图
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) { UINT num = ; // number of image encoders U ...