锁定老帖子 主题:雏凤清音 -- 面向数据的前端编程方法
精华帖 (0) :: 良好帖 (13) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-01-11
最后修改:2010-01-11
名词解释:
这里面,我们需要对用户分组列表执行:添加、删除、修改、保存、取消、排序等六种功能。
var data = { "list" : [ {"id" : 1,"name" : "我的分组1"}, {"id" : 2,"name" : "我的分组2"}, {"id" : 3,"name" : "我的分组3"}, {"id" : 4,"name" : "我的分组4"}, {"id" : 5,"name" : "我的分组5"}, {"id" : 6,"name" : "我的分组6"} ] } var action = { sort:function(list, inc){ $("sort").className = inc?"down":"up"; list.sort(function(a, b){ return (inc?1:-1)*a.name.localeCompare(b.name); }); render(data); }, create : function(name){ data.list.push({id: +new Date(),name: name}); render(data); }, edit : function(id){ each(data.list, function(value, i){ data.list[i].state = value.id == id ? "edit" : "normal"; }); render(data); }, del : function(id){ each(data.list, function(value, i){ if(value.id == id){ data.list.splice(i,1); } }) render(data); }, save : function(id){ each(data.list, function(value, i){ if(value.id == id){ value.name = $("g_" + id).value; value.state = "normal"; } }); render(data); }, cancel : function(id){ each(data.list, function(value, i){ data.list[i].state = "normal"; }); render(data); } } function $(id){ return document.getElementById(id); } function each(obj, fn){ for (var i = 0; i < obj.length; i++) { fn.call(obj[i], obj[i], i); } } function render(data){ $("container").innerHTML = teamList(data); }
<c:client id="teamList"> <c:for items="${list}" var="item"> <div class="${item.state}"> <c:if test="${item.state == 'edit'}"> <div class="cell1"> <input id="g_${item.id}" value="${item.name}" /> </div> <div class="cell2"> <button onclick="action.submit(${item.id})"> 提交 </button> </div> <div class="cell3"> <button onclick="action.cancel(${item.id})"> 取消 </button> </div> </c:if> <c:else> <div class="cell1">${item.name}</div> <div class="cell2"> <img src="images/edit.gif" onclick="action.edit(${item.id})" /> </div> <div class="cell3"> <img src="images/delete.gif" onclick="action.del(${item.id})" /> </div> </c:else> </div> </c:for> </c:client>
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-11
不是面向数据,而且把模型丢到js里了。
|
|
返回顶楼 | |
发表时间:2010-01-11
好复杂的实现,但不用渲染整个
var groupManagerCmp = { body: "#userGroup", viewTemplete: new Template( "<tr><td>${name}</td><input type='button' value='编辑' /><td></td><td><input type='button' value='删除' /></td></tr>"), editTemplate: new Template( "<tr><td><input type='text' value='${name}'></td><td><input type='button' value='提交' /></td><td><input type='button' value='取消' /></td></tr>"), renderViewRow: function(id, name){ var tr = this.viewTemplete.bind(id,name); $("input[0]",tr).click(function(){ //编辑 groupManagerCmp.edit(tr, id, name); }) $("input[1]",tr).click(function(){ //删除 action.do("delete", {id: id}, function(){ groupManagerCmp.remove(tr); }) }) return tr; }, renderEditRow: function(id, name){ var tr = this.editTemplate.bind(id,name); $("input[0]",tr).click(function(){ //提交 action.do("put", {id: id, name: name}, function(group){ groupManagerCmp.update(tr, group.id, group.name); }) }); $("input[1]",tr).click(function(){ //取消 groupManagerCmp.update(tr, id, name); }) return tr; }, append: function(id, name){ $(this.body).appendChild(this.renderViewRow(id, name)); }, remove: function(trNode){ $(this.body).removeChild(trNode); }, edit: function(trNode, id, name){ $(this.body).replaceNode(trNode, this.renderEditRow(id, name)); }, update: function(trNode, id, name){ $(this.body).replaceNode(trNode, this.renderViewRow(id,name)); } } var action = { url: { post: "group/new", put: "group/update", delete: "group/destroy" } do: function(action, params, callback){ ajax(this.url[action], params, function(data){ callback(decode(data)) }); } } |
|
返回顶楼 | |
发表时间:2010-01-11
非常不错。
hehe,按照js模板的需要生成数据。以前我们做B/S项目也是这么做的。后来也看过一个js后端的服务器,还实验过。很多方法都可以动态,不过没有在项目中体现出来究竟能省多少。担心js做后端影响项目的通用性。 |
|
返回顶楼 | |
发表时间:2010-01-12
我感觉你的东西要开始真正的普及了。
|
|
返回顶楼 | |
发表时间:2010-01-12
akandfxs 写道 非常不错。
hehe,按照js模板的需要生成数据。以前我们做B/S项目也是这么做的。后来也看过一个js后端的服务器,还实验过。很多方法都可以动态,不过没有在项目中体现出来究竟能省多少。担心js做后端影响项目的通用性。 js后端就算了吧。不靠谱。 前端模板也一直没有看见过真正实用的。 我认同的前端模板使用方式只有两种: 1. 在后端模板中嵌入前端模板,让后端模板作为前端模板编译的平台 2. 使用脚本托管机制(如JSI),开发时候可以实时编译,但是导出上线的时候,能后抛掉编译工作,轻装发布。 |
|
返回顶楼 | |
发表时间:2010-01-12
我们也是这样的做法,不过我们把数据放到xml document里面,对于复杂关系的数据场合,xml document比js array更方便操作
xml document可以看作在客户端的一个数据库,xpath作为sql,数据的改变通过js写入xml document,同时js对dom进行相应改动,客户端的任何修改都不会和服务器交互,只有最后保存xml document时才和服务器打交道 |
|
返回顶楼 | |
发表时间:2010-01-12
每次都是从Model生成View。的确费一点电,不过能接受就好。
问题是view层自己的状态就没有了吗?还都保存在model里? |
|
返回顶楼 | |
发表时间:2010-01-12
这种方法优点很多,省略500字,但是model和view的状态有时是不一致的。比如
a。 重新生成的view有滚动条的位置需要记忆时怎么办? b。 用户选择了几个item,想同时操作,例如同时删除,在删除前想做一个排序,如何记忆那几个item被选择了? |
|
返回顶楼 | |
发表时间:2010-01-12
最后修改:2010-01-12
taocong810 写道 这种方法优点很多,省略500字,但是model和view的状态有时是不一致的。比如
a。 重新生成的view有滚动条的位置需要记忆时怎么办? b。 用户选择了几个item,想同时操作,例如同时删除,在删除前想做一个排序,如何记忆那几个item被选择了? 恩,每一种方法都有自己的局限性。 我们也发现了不少不适合用模板的地方。基本的特点就是,连续动作。比如拖放,动画,就不适合了。 a. 内容本身的滚动条所有浏览器都会记录的,当能,如果你是内容内部元素的滚动条,那就不行了。 b. checkbox点击的时候同步数据就可以了。 |
|
返回顶楼 | |