惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

博客园 - 成为-行动-拥有(BeDoHave)

我的MIS快速开发框架集成参考 选择一个框架的权衡建议 简单为美的IT开发尝试 请跟我来(完)--使用Ext及其llano的注意事项 请跟我来--使用Ext+llano快速搞定CRUD 请跟我来--Ext数据应用开发的几板斧 请跟我来(EXT2.0+llano实践) 2007年的最后的几笔 用NBear和QPG分布式框架改善生活 - 成为-行动-拥有(BeDoHave) - 博客园 风继续吹----对一些ORM框架的使用心得(2) 冷眼程序人生----对一些ORM框架的使用心得 欢迎新成员加入! QPG分布框架1.1.1 需求看板单机版可以使用了 QPG加速器的使用 QPG分布框架V1.1 BETA2说明 是"渔"非"鱼"--QPG分布处理框架V1.1(Beta1)简介 实践篇(4)—需求看板解析 实践篇(3)--关于事务处理的一点细节
请跟我来--使用Ext搞个原型
成为-行动-拥有(BeDoHave) · 2008-01-02 · via 博客园 - 成为-行动-拥有(BeDoHave)

    Ext本身就带有比较专业和酷的示例,这也是Ext明显强过其他js框架的地方,所以大家最好少看那些简单翻译一下就发表的示例,实在是浪费时间。关于一些高级的用法,最佳方式就是看源码和其他比较好的扩展控件写法,当然园子里有几篇原创的Ext入门文章,看看也是有好处的。
   
为了运行下面的例子,请下载ext2.0,实际上我的例子也是从form-grid等例子修改而来的。
    会员分组统计界面如下:

 
数据维护界面如下:

 
说明:做过C/S数据应用的程序员都明白,我们一般会定义数据源,然后再将其绑定到界面组件上。在EXT中,如果要测试界面组件是否正确,则用以下几行就能轻松搞定了:

var myData = [
        [
'1','alex','lsj@21cn.com','13226612334',1995,'2007-10-20 10:00:00'],
        [
'2','tom','tom@21cn.com','13826782334',1996,'2007-10-20 10:00:00'],
        [
'3','cx8','cx@163.com''139250802541',1999,'2008-11-12 08:00:00']
      ];
  
var ds = new Ext.data.Store({
        reader: 
new Ext.data.ArrayReader({},[
          
'id','Name','Email','Mobile',//通常的字符型可简单定义
          {name: 'GradYear', type: 'int'},
          
{name: 'sCreatedDate', type: 'date', dateFormat: 'Y-m-d H:i:s'}
        ])
      }
);
  ds.loadData(myData);

要同时绑定到数据列表组件和编辑组件则可以如下办理:

var gridForm = new Ext.FormPanel({
       id: 
'member-form',frame: true, labelAlign: 'left',
layout: 
'column',    // 以列方式布局
……
     items: [
{
         columnWidth: 
0.6,layout: 'fit',//左边列放列表
         items: {
           xtype: 
'grid',  ds: ds, cm: colModel, sm: rsm,id:'member-grid',
           title:
'会员列表', border: true, stripeRows: true, frame: true,  height: 450,
           ……
         }

       }
,{
         xtype: 
'fieldset',columnWidth: 0.4,//右边列放编辑板
         ……,
         items: [
           
{fieldLabel:'姓名',name: 'Name',allowBlank: false,minLength:3,maxLength:8,anchor:'90%'}
           
{fieldLabel:'邮件',name: 'Email',vtype:'email',anchor:'90%'},  
           
{fieldLabel:'手机',name: 'Mobile',anchor:'90%'},
           
{fieldLabel:'毕业年份',name: 'GradYear',xtype:'numberfield',anchor:'90%',value: '2008'},   
           
{fieldLabel:'登记日期',name: 'sCreatedDate', xtype:'datefield',format: 'Y-m-d H:i:s', anchor:'90%'} 
         ],
……


接下来我们要进行事件处理:

  1) 列表当前选择记录和编辑框同步:
   

var rsm=new Ext.grid.RowSelectionModel({
                     singleSelect: 
true,
                    listeners: 
{
                        rowselect: 
function(sm, row, rec) {
                            Ext.getCmp(
"member-form").getForm().loadRecord(rec);
                        }

                    }

              }
);
……
buttons: [ 
           
{text: '修改',handler:function()
              
var frm=Ext.getCmp("member-form").getForm(); 
              
if(frm.isValid()) frm.updateRecord(rsm.getSelected()); //把右边编辑过的数据更新到左边的列表
              }
            
           }

           
{text: '清空',handler:function()
              
var frm=Ext.getCmp("member-form").getForm(); 
              frm.reset(); 
              }
 
           }
 
         ]


2) 新增记录到缓存:

function addNew() {
   
var r=rsm.getSelected().copy();
   r.data[
'id']='';r.data['Name']='???';
   
var grid=Ext.getCmp("member-grid");
   grid.stopEditing();
   ds.insert(
0, r);
   ds.commitChanges();
   grid.getView().refresh();
 }


3) 从缓存中删除一条记录:

 function deleteRec() {
   
if(rsm.getCount()<1return;
   
var r=rsm.getSelected();
   
var grid=Ext.getCmp("member-grid");
   grid.stopEditing();
   ds.remove(r);
   ds.commitChanges();
   grid.getView().refresh();
 }


要个性化显示也很简单,比如我们把1998年前毕业的用红色,否则用绿色标记:

  function myRenderer(val){
    
if(val > 1998)
      
return '<span style="color:green;">' + val + '</span>';
    
return '<span style="color:red;">' + val + '</span>';
  }

var colModel = new Ext.grid.ColumnModel([
      ……,
        
{header: "毕业年份", width: 65, sortable: true, renderer: myRenderer, dataIndex: 'GradYear'},
        ……
      ]);


    我们从使用中看出Ext设计十分灵活,让我有当初使用Delphi的那种爽的感觉!Ext的数据模型还是比较简单易懂的,基本可以应付常见的应用,我们也看到对于新增加的记录,它还缺乏一些状态,就不如.NET框架中DataSet中那么强有力。可能是要考虑不能太过于复杂,否则js框架就太大了,毕竟是要下载到客户端去的。但是我们仍然可以想一些办法区分,比如:r.data['id']='';这样我们在后台就可以知道这是新增加的记录。
    
再看看统计则要用扩展的分组统计组件。定义数据源稍微有些变化,多了几点:

function createGroupingStore(){
  
var myData = [
        [
'1','alex','lsj@21cn.com','13226612334',1995,'2007-10-20 10:00:00'],
        [
'2','tom','tom@21cn.com','13826782334',1995,'2007-10-20 10:00:00'],
        [
'3','cx8','cx@163.com''139250802541',1999,'2008-11-12 08:00:00']
      ];
  
var ds = new Ext.data.GroupingStore({
        reader: 
new Ext.data.ArrayReader({},[
          
'id','Name','Email','Mobile',
          
{name: 'GradYear', type: 'int'},
          
{name: 'sCreatedDate', type: 'date', dateFormat: 'Y-m-d H:i:s'}
        ]),
        groupField: 
'GradYear',
        remoteSort: 
false
      }
);
  ds.setDefaultSort(
'sCreatedDate','DESC');
  ds.loadData(myData);
  
return ds;
}


var xg = Ext.grid;
  
var ds=  createGroupingStore();
  
var rsm = new xg.CheckboxSelectionModel();
  
var summary = new Ext.grid.GroupSummary(); 
  
var grid = new xg.GridPanel({
        ds: ds,
        columns: [ rsm,
          
{
            header: 
"姓名", width: 60, sortable: true,  dataIndex: 'Name',summaryType: 'count',
            summaryRenderer: 
function(v, params, data){
              
return ((v === 0 || v > 1? '(' + v +' 人)' : '(1 人)');
            }
//自定义汇总处理
          }
,
          
{header: "邮件", width: 175, sortable: true,  dataIndex: 'Email'},
          
{header: "手机", width: 125, sortable: true, dataIndex: 'Mobile'},
          
{header: "毕业年份", width: 200, sortable: true,  dataIndex: 'GradYear'},
          
{header: "登记日期", width: 85, sortable: true, summaryType: 'max',renderer: Ext.util.Format.dateRenderer('Y/m/d'), dataIndex: 'sCreatedDate'}
        ],
        sm:rsm,
        view: 
new Ext.grid.GroupingView({
          forceFit:
true,
          showGroupName: 
true,
          hideGroupedColumn: 
true
        }
),
        plugins: summary,
        frame:
true,width: 800,height: 450,clicksToEdit: 0,
        collapsible: 
true, animCollapse: false,trackMouseOver: false,
        enableColumnMove: 
false,title: '分组列表',
        iconCls: 
'icon-grid',
        renderTo: document.body
    }
);

 

OK,有点感觉了吗?最好下载demo实际运行一下,请把例子解压到ext2.0/examples/demo目录,运行那form.html以及group.html即可

聪明的读者肯定就要问,那如何实际从数据库中加载数据并且提交修改数据回数据库呢?那就请听下回分解吧。

Alex