js如何实现设计模式中的模板方法


Posted in Javascript onJuly 23, 2013

在js中如何实现设计模式中的模板方法?
思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法就会被后一个方法覆盖掉,使用此特点就可以实现模板方法。

例如在实际的项目中有很多页面操作的步骤基本相同,但局部细节却不一样。例如在我所在的项目中,就有很多展示数据库记录的页面,每个页面都存在读取记录,查询记录,增加删除,修改记录等相同的操作,但对应的后台方法却不一样。

function ListCommon2() { 
var urlAdd; 
var urlAjax; 
var tableid; 
var titleText=""; 
var winid = "#win"; 
var columns; 
var toolbars; 
var queryParams; 
var colkey; 
var toolbarsType 
this.initList = function (aurlAdd, aurlAjax, atableid, atitleText, awinid, acolumns, atoolbarsType) { 
urlAdd = aurlAdd; 
urlAjax = aurlAjax; 
if (atableid) { 
tableid = atableid; 
} 
if (atitleText) { 
titleText = atitleText; 
} 
if (atitleText) { 
winid = awinid; 
} 
columns = acolumns; 
toolbarsType = atoolbarsType; 
}; 
this.initData = function () { 
if (!toolbarsType) { 
toolbars = [{ text: '添加', iconCls: 'icon-add', handler: Add }, '-', { text: '编辑', iconCls: 'icon-edit', handler: this.Edit } 
, '-', { text: '删除', iconCls: 'icon-cancel', handler: this.delMsg } 
]; 
} else { 
toolbars = toolbarsType; 
} 
queryParams = this.GetqueryParams(); 
$(tableid).datagrid({ 
url: urlAjax + '?OperationType=list', 
columns: columns, 
toolbar: toolbars, 
idField: colkey, 
pagination: true, 
pageSize: 20, 
sortName: colkey, 
sortOrder: 'desc', 
rownumbers: true, fitColumns: true, 
striped: true, 
method: "post", 
striped: true, 
queryParams: this.GetqueryParams(), 
showFooter: true 
, pageList: [10, 20, 30, 40, 50] 
}); 
$("#add").click(function (e) { 
Add(); 
}) 
$("#edit").bind('click', { obj: this }, function (event) { 
event.data.obj. Edit(); 
}) 
$("#del").bind('click', { obj: this }, function (event) { 
event.data.obj.delMsg(); 
}) 
$("#btnQuery").bind('click', { obj: this }, function (event) { 
var queryParamsnew = event.data.obj.GetqueryParams(); 
$(tableid).datagrid('load', queryParamsnew) 
}) 
} 
this.GetqueryParams = function () { 
var NameList = this.Getcolsinfo(); 
var otherQueryParams = this.GetOtherQueryParams(); 
if (!otherQueryParams) { 
return { colkey: colkey, colsinfo: NameList } 
} 
else { 
return otherQueryParams; 
} 
} 
this.GetOtherQueryParams = function () { 
return null; 
} 
this.Getcolsinfo = function () { 
var fieldNameList = []; 
if (columns.length > 0) { 
for (var i = 0; i < columns[0].length; i++) { 
fieldNameList.push(columns[0][i].field); 
} 
} 
else { 
alert("未绑定数据"); 
} 
colkey = fieldNameList[fieldNameList.length-1]; 
var NameList = fieldNameList.join(","); 
return NameList 
} 
function Add() { 
var _content = '<iframe id="FRMdetail" frameborder="0" src=' + urlAdd + ' style="width:100%;height:100%;" ></iframe>'; 
$(winid).dialog({ 
width: 600, 
height: 400, 
modal: true, 
content: _content, 
title: "增加" + titleText, 
draggable: true, 
resizable: true, 
shadow: true, 
minimizable: false 
}); 
} 
this.Edit = function (editId) { 
var id; var obj = typeof (editId); 
if (!editId || obj == "object") { 
var items = $(tableid).datagrid('getSelections'); 
var length = items.length; 
if (length == 0) { 
$.messager.alert('提示', '请选择一条记录然后编辑'); 
return; 
} else if (length > 1) { 
$.messager.alert('提示', '由于一次只能编辑一条记录,所以只能修改第一条记录'); 
return; 
} 
id = GetId(items[0]); 
} 
else { 
id = editId; 
} 
var _content = '<iframe id="FRMdetail" frameborder="0" src=' + urlAdd + '?Id=' + id + ' style="width:100%;height:100%;" ></iframe>'; 
$(winid).dialog({ 
width: 600, 
height: 400, 
modal: true, 
content: _content, 
title: "修改" + titleText, 
draggable: true, 
resizable: true, 
shadow: true, 
minimizable: false 
}); 
} 
this.windowclose = function () { 
$(winid).window('close'); 
} 
this.SaveOkCallback = function () { 
this.windowclose(); 
$(tableid).datagrid('reload'); 
$(tableid).datagrid('unselectAll'); 
} 
this.delMsg = function (delId) { 
var length = 1; 
var id; 
var items; var obj = typeof (delId); 
if (!delId || obj == "object") { 
items = $(tableid).datagrid('getSelections'); 
length = items.length; 
if (length == 0) { 
$.messager.alert('提示', '请至少选择一条记录然后删除'); 
return; 
} 
} 
else { 
id = delId; 
} 
var text = '你确认删除' + length + '条记录吗?'; 
if (length == 1) { 
text = '你确认删除该条记录吗?'; 
} 
$.messager.confirm('提示', text, function (r) { 
if (r) { 
if (!delId) { 
var idList = []; 
$.each(items, 
function (key, value) { 
var id = GetId(value); // in case we're changing the key 
idList.push(id); 
}); 
id = idList.join(","); 
} 
del(id) 
} 
}); 
} 
function del(id) { 
$.ajax({ type: "post", 
url: urlAjax + "?OperationType=del&id=" + id, 
success: function (msg) { 
var obj = jQuery.parseJSON(msg); 
if (obj.IsSuccess == true) { 
$.messager.alert('提示', obj.Msg); 
selectcallback(); 
} 
else { 
$.messager.alert('提示', obj.Msg); 
} 
} 
}); 
} 
function selectcallback() { 
SaveOkCallback(); 
} 
}

仔细看看就会发现,这段代码就包含了,查询,修改,添加,删除等几乎所有的操作,但由于查询条件传递的参数不同,所以有一个需要重写的方法this.GetOtherQueryParams
根据不同的页面重写就可以了。
例如如下一个页面的重写:
$(document).ready(function () { 
obj = new ListCommon2(); 
obj.initList(urlAdd, urlAjax, tableid, titleText, winid, columns, '#tb'); 
obj.GetOtherQueryParams = function () { 
var colsinfo = obj.Getcolsinfo(); 
return { colsinfo: colsinfo, SWV_Performance_fk: $('#SWV_Performance_fk').combobox('getValue'), S_NAME: $("#S_NAME").val(), SQ_NAME: $("#SQ_NAME").val() }; 
} 
obj.initData(); 
})

当然也可以不定义方法,此处只调用,例如GetId(items[0]);在此处就没有定义,在具体的页面在具体定义
<script type="text/javascript"> 
function GetId(item) { 
return item.SWV_ID 
} 
</script>

都可以达到同样的效果。还有一种就是传递一个函数。具体哪种方式最合适,个人认为还是使用模板方法最好。
Javascript 相关文章推荐
javascript 写类方式之六
Jul 05 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 Javascript
js类式继承的具体实现方法
Dec 31 Javascript
jQuery中after()方法用法实例
Dec 25 Javascript
jQuery中:first-child选择器用法实例
Dec 31 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
js实现具有高亮显示效果的多级菜单代码
Sep 01 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
Jun 12 Javascript
vue使用vue-cli快速创建工程
Jul 28 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
Feb 09 Javascript
详解Vuex下Store的模块化拆分实践
Jul 31 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 Javascript
js替换字符串的所有示例代码
Jul 23 #Javascript
通过一段代码简单说js中的this的使用
Jul 23 #Javascript
JS分页控件 可用于无刷新分页
Jul 23 #Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 #Javascript
offsetHeight在OnLoad中获取为0的现象
Jul 22 #Javascript
用jQuery获取IE9下拉框默认值问题探讨
Jul 22 #Javascript
JS 实现图片直接下载示例代码
Jul 22 #Javascript
You might like
一个简单的自动发送邮件系统(三)
2006/10/09 PHP
php 获取远程网页内容的函数
2009/09/08 PHP
php用户注册信息验证正则表达式
2015/11/12 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
javascript日期对象格式化为字符串的实现方法
2014/01/14 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
jquery ajax结合thinkphp的getjson实现跨域的方法
2016/06/06 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
原生js实现无限循环轮播图效果
2017/01/20 Javascript
详解Angular 自定义结构指令
2017/06/21 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
2017/07/23 Javascript
Vue精简版风格概述
2018/01/30 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
[01:00:06]加油DOTA_EP01_网络版
2014/08/09 DOTA
[03:35]2018年度DOTA2最佳辅助位选手5号位-完美盛典
2018/12/17 DOTA
python的id()函数介绍
2013/02/10 Python
Python列表list数组array用法实例解析
2014/10/28 Python
python爬虫基本知识
2018/03/05 Python
pandas数据分组和聚合操作方法
2018/04/11 Python
解决Python 异常TypeError: cannot concatenate 'str' and 'int' objects
2020/04/08 Python
基于tensorflow __init__、build 和call的使用小结
2021/02/26 Python
英国文胸专家:AmpleBosom.com
2018/02/06 全球购物
eBay爱尔兰站:eBay.ie
2019/08/09 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
毕业生造价工程师求职信
2013/10/17 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
环境保护与污染治理求职信
2014/07/16 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
拾金不昧表扬稿
2015/01/16 职场文书