Ext学习总结——EditPanel的实现
来源:互联网 发布:金融简史 知乎 编辑:程序博客网 时间:2024/06/17 00:16
Ext是一个很成熟的js框架,他的store存储结构将发送请求和接受请求封装起来,如此,我们只需要定义数据来源和数据结构,便可以通过store.load()获取数据:
//proxy:new Ext.data.ScriptTagProxy({ url:'http://localhost:17319/KBS/Grid/EditString.aspx'}),
proxy:new Ext.data.HttpProxy({ url:'salesTargetList.action'}),
reader: new Ext.data.JsonReader(
{
totalProperty : 'totalCount',
root : 'root',
id : 'storeID'
},
[
{name: 'id', type: 'int'},
{name: 'orderMonth', type: 'int'}, // 格式:200709
{name: 'storeID', type: 'int'},
{name: 'storeName'},
{name: 'vp', type: 'float'},
{name: 'sales', type: 'float'},
{name: 'newSR', type: 'int'},
{name: 'newPC', type: 'int'}
])
});
proxy指定了数据来源,将请求发送至salesTargetList.action, 而reader定义了它所读取数据的格式。这里我们所碰到的第一个问题出现了——那就是如何将一张查询出来的二维表格序列化成json对象。在项目框架 中,我们得到的结果通常是一个或一组(List)doMain对象,那么如何将它们转为可以被读取的数据格式呢?
我用的是一个插件jsonrpc,它不但解决了上面的问题,而且还提供将java类注册到js里的功能,如此,你可以在js中调用框架的业务逻辑。如此,可以让Ext更好地融合到你的项目中。好吧!这篇文章并不是介绍这个插件的。
salesTargetList.action在struts.xml中配置:
class="com.herbalife.report.web.action.BizSalesTargetAction">
<result type="json">
<param name="root">bizSalestarget</param>
</result>
<interceptor-ref name="params" />
<interceptor-ref name="servlet-config" />
</action>
后面我会在一篇博客中,专门介绍一下这个插件的功能和配置。
那么,经过序列化,store便可以正确的读取到数据,格式如下:
"totalCount":2,
"root":
[
{ "id":4,"orderMonth":200712,"sales":480.0,"storeID":1,"storeName":"Altria Group Inc","vp":300.39},
{"id":5,"orderMonth":200712,"sales":112.0,"storeID":2,"storeName":"AT&T Inc.","vp":1111.0}
]
}
如果没有这个插件,你可以将这种格式的字符串,写入response中。前面是存储结构的定义,下面是列模型的定义:
var cm = new Ext.grid.ColumnModel([
{header: "StoreID", dataIndex: 'storeID', width: 50,align:'center',
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true
}))
},{header: "StoreName", dataIndex: 'storeName', width: 185,align:'left',
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true
}))
},{header: "OrderMonth", dataIndex: 'orderMonth', width: 80,align:'center',//renderer:formatDate,
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true // 设置无法编辑
}))
},{header: "VP", dataIndex: 'vp', width: 70,renderer: 'usMoney',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
},{header: "Sales", dataIndex: 'sales', width: 70,renderer: 'usMoney',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
}]);
// by default columns are sortable
cm.defaultSortable = true;
接下来就是对editGrid的定义了:
ds: store,
cm: cm,
enableColLock: false,
renderTo: document.body
});
ds 数据源,cm列模型。前面'grid-example'是页面中grid的载体——一个div的id,我们将grid绘制在这个div上。你需要将上面的 内容放在Ext.onReady(function(){},如此保证在打开页面时,就开始执行他们。完整代码附在文章最后。
如此一个editgird便完成了。你现在要做的是,确保访问salesTargetList.action能拿到数据。如果在.net下,就更方便了, 在page_load方法中,直接将满足格式的字符串,Response.write一下,然后调用end()方法,你便可以通过url访问了,如: http://localhost:4321/KBS/Grid/JsonString.aspx。当然,如果你电脑上有vs环境,你同样可以在java 中,使用上面那个链接(保证vs的虚拟网站处于运行状态),在store定义数据源,你需要使用ScriptTagProxy,表示跨域访问:proxy:new Ext.data.ScriptTagProxy({ url:'http://localhost:17319/KBS/Grid/EditString.aspx'})
附代码:
* Ext JS Library 1.1
* Copyright(c) 2006-2007, Ext JS, LLC.
* TonkNet@lislie
*
*/
function formatPercent(value){
return value + '%';
};
function formatDate(value){
//return value.substring(0,4) + '年' + value.substring(4,value.length) + '月';
var tmp = '';
for(var i=0;i<value.length;i++)
{
tmp += value.charAt(i);
if(i == 3)
tmp += '/';
}
return tmp;
};
Ext.onReady(function(){
Ext.QuickTips.init();
// shorthand alias
var fm = Ext.form, Ed = Ext.grid.GridEditor;
// the column model has information about grid columns
// dataIndex maps the column to the specific data field in
// the data store (created below)
var cm = new Ext.grid.ColumnModel([
{header: "StoreID", dataIndex: 'storeID', width: 50,align:'center',
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true
}))
},{header: "StoreName", dataIndex: 'storeName', width: 185,align:'left',
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true
}))
},{header: "OrderMonth", dataIndex: 'orderMonth', width: 80,align:'center',//renderer:formatDate,
editor: new Ed(new fm.TextField({
allowBlank: false,
disabled : true
}))
},{header: "VP", dataIndex: 'vp', width: 70,renderer: 'usMoney',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
},{header: "Sales", dataIndex: 'sales', width: 70,renderer: 'usMoney',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
},{header: "NewSR", dataIndex: 'newSR', width: 60,align:'right',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
},{header: "NewPC", dataIndex: 'newPC', width: 60,align:'right',
editor: new Ed(new fm.TextField({
allowBlank: false
}))
}]);
// by default columns are sortable
cm.defaultSortable = true;
// create the Data Store fro gird
var store = new Ext.data.Store({
//proxy:new Ext.data.ScriptTagProxy({ url:'http://localhost:17319/KBS/Grid/EditString.aspx'}),
proxy:new Ext.data.HttpProxy({ url:'salesTargetList.action'}),
reader: new Ext.data.JsonReader(
{
totalProperty : 'totalCount',
root : 'root',
id : 'storeID'
},
[
{name: 'id', type: 'int'},
{name: 'orderMonth', type: 'int'}, // 格式:200709
{name: 'storeID', type: 'int'},
{name: 'storeName'},
{name: 'vp', type: 'float'},
{name: 'sales', type: 'float'},
{name: 'newSR', type: 'int'},
{name: 'newPC', type: 'int'}
])
});
store.load();
// create the editor grid
var grid = new Ext.grid.EditorGrid('grid-example', {
ds: store,
cm: cm,
enableColLock: false,
renderTo: document.body
});
var layout = Ext.BorderLayout.create({
center: {
margins:{left:3,top:3,right:3,bottom:3},
panels: [new Ext.GridPanel(grid)]
}
}, 'grid-panel');
// render it
grid.render();
var gridHead = grid.getView().getHeaderPanel(true);
var monthText = new Ext.form.TextField({name : 'monthT',id : 'monthT'}); // 月份 TextField
var storeList = new Ext.form.ComboBox({ // 店铺 storeName
id : 'storeL',
name: 'storeL',
store: store,
valueField:'storeID',
typeAhead: true,
displayField: 'storeName',
triggerAction: 'all',
emptyText:'Select a store...',
selectOnFocus:true,
width:135
});
var tb = new Ext.Toolbar(gridHead,
[{
text : '月份',
handler : function() {
alert('请按如下格式输入日期:200707');
}
},monthText,{
text : '店铺'
},storeList
,{
text : '查询',
handler : doSearch
},{
text : '保存',
handler : Save
}
]);
/* ---------------- #region Filter ------------------- */
/*Ext.get('storeL').on('change', SFilter, this, true);
function SFilter(combo,a,b) {
alert('111');
var storeName = storeList.getValue();
store.filter("storeName", storeName, false);
}*/
/* ---------------- #endregion Filter ------------------- */
/* ---------------- #endregion Check ------------------- */
Ext.get('monthT').on('blur', Check);
function Check() {
var value = document.getElementById('monthT').value;
var i = IsNumber(value);
if(i > -1) {
Ext.MessageBox.show({
title:'提示',
msg: '月份包含非法字符:"' + value.charAt(i) + '",请输入数字',
buttons: Ext.Msg.OK
});
return;
}
}
function IsNumber(str) {
var inStr = "1234567890";
for(var i=0;i<str.length;i++) {
if(inStr.indexOf(str.charAt(i)) == -1)
return i;
}
return -1;
}
/* ---------------- #endregion Check ------------------- */
/* ---------------- #region Search ------------------- */
function doSearch() {
var mt = monthText.getValue();
var sn = storeList.getRawValue();
var msg = 'You condition is : ';
if(mt != null)
msg += 'month = "' + mt + '" ,';
if(sn != null)
msg += 'storeName = "' + sn + '"';
Ext.example.msg('Message',msg,this);
store.load({params : {month : mt,storeName : sn}});
}
/* ---------------- #region Search ------------------- */
/* ---------------- #region Update ------------------- */
function Save(){
Ext.MessageBox.confirm('提示', '确实要保存修改记录?',doSave);
}
function doSave() {
jsonurl = "/JSON-RPC";
jsonrpc = new JSONRpcClient(jsonurl);
var modi = grid.dataSource.getModifiedRecords(); // 获取更改数据行记录
if(modi.length <= 0) {
Ext.MessageBox.show({
title:'提示',
msg: '您没有修改任何数据',
buttons: Ext.Msg.OK
});
return;
}
var result = [];
for(var i=0;i<modi.length;i++) {
var value = modi[i].data.newSR;
var i = IsNumber("0123456789.",value);
if(i > -1) {
Ext.MessageBox.show({
title:'提示',
msg: 'NewSR中包含非法字符:' + value.charAt(i),
buttons: Ext.Msg.OK
});
return;
}
value = modi[i].data.newPC;
i = IsNumber("0123456789.",value);
if(i > -1) {
Ext.MessageBox.show({
title:'提示',
msg: 'NewPC中包含非法字符:' + value.charAt(i),
buttons: Ext.Msg.OK
});
return;
}
result.push(modi[i].data);
}
jsonrpc.ajaxfacade.testModi(result); // 调用java类
Ext.MessageBox.show({
title:'提示',
msg: '修改成功',
buttons: Ext.Msg.OK
});
}
/* ---------------- #endregion Update ------------------- */
});
效果图:
- Ext学习总结——EditPanel的实现
- Ext学习总结——序
- EXT学习总结
- 问题七-EditPanel与Panel的区别(待补充~)
- Ext JS 4的性能与学习之我见——《Ext JS权威指南》后记
- ext 初探 学习与总结
- EXt js 学习笔记总结
- EXt js 学习笔记总结
- EXt js 学习笔记总结
- 带分页的表格 ——Ext学习
- 对Ext—Gwt学习有用的博文网址
- ExtJS学习------Ext.define的继承extend,用javascript实现类似Ext的继承
- EXT的实现
- Ext实现的Dashboard
- ext-gwt分页实现送给正在学习gxt的朋友们
- ext的学习网址
- ExtJs学习一 Ext.define 与 Ext.create 方法总结
- Ext常用问题的总结
- DataSource Control 之Cache機制
- WTF of WPF [Part One]- Templating & Styling
- E文积累_20080103_around the clock
- Ubuntu下设置启动顺序
- .NET下正则表达式应用的四个示例
- Ext学习总结——EditPanel的实现
- 《Don't Make Me Think》
- 《Java & XML》3rd Edition
- 浅复制与深复制概念
- 平淡生活:我居然被骗了
- 最亲密接触Dhtml&JScript开发细节
- 关于接口和抽象类的一点小想法
- linux-tar命令
- 运行时类型识别(RTTI)