js如何实现设计模式中的模板方法
js如何实现设计模式中的模板方法
发布时间:2016-12-30 来源:查字典编辑
摘要:在js中如何实现设计模式中的模板方法?思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法...

在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 + ' ></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 + ' ></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教程学习
编程开发子分类