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 相关文章推荐
基于jQuery的输入框在光标位置插入内容, 并选中
Oct 29 Javascript
写自已的js类库需要的核心代码
Jul 16 Javascript
给文字加上着重号的JS代码
Nov 12 Javascript
封装的jquery翻页滚动(示例代码)
Nov 18 Javascript
解析Javascript中中括号“[]”的多义性
Dec 03 Javascript
jquery 将当前时间转换成yyyymmdd格式的实现方法
Jun 01 Javascript
Bootstrap如何激活导航状态
Mar 22 Javascript
JS实现图片点击后出现模态框效果
May 03 Javascript
vue2.0结合Element实现select动态控制input禁用实例
May 12 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
May 15 Javascript
Layui实现主窗口和Iframe层参数传递
Nov 14 Javascript
vue v-on:click传递动态参数的步骤
Sep 11 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
常用星际术语索引(新手指南)
2020/03/04 星际争霸
简单的php文件上传(实例)
2013/10/27 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
动态的改变IFrame的高度实现IFrame自动伸展适应高度
2012/12/28 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
JavaScript 闭包机制详解及实例代码
2016/10/10 Javascript
javascript 利用arguments实现可变长参数
2016/11/21 Javascript
Js实现中国公民身份证号码有效性验证实例代码
2017/05/03 Javascript
Angular @HostBinding()和@HostListener()用法
2018/03/05 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
Vue+Element自定义纵向表格表头教程
2020/10/26 Javascript
[01:59][TI9趣味视频] 全明星赛奖励
2019/08/23 DOTA
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
2015/04/25 Python
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
深入理解python try异常处理机制
2016/06/01 Python
django使用haystack调用Elasticsearch实现索引搜索
2019/07/24 Python
使用Tensorflow实现可视化中间层和卷积层
2020/01/24 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
次世代生活态度:Hypebeast
2018/07/05 全球购物
美国杰西潘尼官网:JCPenney
2019/06/12 全球购物
如何写好自荐信
2014/04/07 职场文书
卫生系统先进事迹
2014/05/13 职场文书
2014组织生活会方案
2014/05/19 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers