ExtJs
- 格式:doc
- 大小:36.00 KB
- 文档页数:6
ExtJs4学习(⼋)数据代理ProxyExtJs数据代理我们介绍常⽤的四种,但会着重介绍ajax代理,因为⽇常开发中,这个最为常⽤Ext.data.proxy.AjaxAjaxProxy(Ajax数据代理类)是你的应⽤程序中使⽤最⼴泛的获取数据的⽅式. 它使⽤AJAX请求来从服务器获取数据, 然后通常将它们放⼊Store中. 让我们来看⼀个典型的配置. 这⾥我们为⼀个Store设置⼀个AjaxProxy代理. ⾸先我们准备好⼀个Model:Ext.define('User', {extend: 'Ext.data.Model',fields: ['id', 'name', 'email']});//⼀个包含AjaxProxy代理的Store, 使⽤参数⽅式绑定.var store = Ext.create('Ext.data.Store', {model: 'User',proxy: {type: 'ajax',url : 'users.json'}});store.load();store.on('load',function(store,records){store.each(function(record){console.log(record.get('name'));});})这⾥说明下官⽹的例⼦是直接使⽤store.each ⽅法,但那是没⽤的store 中each()⽅法的使⽤应在load完使⽤,确切的说应该在on('load')事件中使⽤,切记我们的例⼦将会把user数据加载到Store中, ⾸先我们定义⼀个Model, Model包含的字段(fields)即为从服务器返回数据的相应字段. 接下来我们定义⼀个Store, 它包含了⼀个proxy配置项. 此配置项将会⾃动转换为⼀个 Ext.data.proxy.Ajax类的实例, 此实例包含了我们定义的url参数. 这等效于下⾯这段代码new Ext.data.proxy.Ajax({url: 'users.json',model: 'User',reader: 'json'});这⾥出现了两个额外的参数 - model和reade. 这些参数在通过Store来创建proxy实例时是默认指定的 - Store中已经定义了 Model,并且Proxy的默认Reader为JsonReader.最后我们调⽤store.load(), 触发执⾏AjaxProxy的action, 向配置的url发送请求(本⽰例为'users.json'). 由于我们执⾏的是数据读取, 所以讲发送⼀个GET⽅式的请求.(请求⽅式的定义参见actionMethods - 默认所有读数据请求(read)的⽅式为GET, ⽽所有写请求(create、update、destroy)的⽅式为POST)配置项actionMethods: {create : 'POST',read : 'GET',update : 'POST',destroy: 'POST'}限制配置Reader和WriterAjaxProxy可以配置任意类型的Reader来解读服务器端的响应. 如果不显式指定Reader, 将默认使⽤JsonReader. 可以使⽤简单属性对象的⽅式来配置Reader,代理将⾃动将其转换为Reader类的实例:var proxy = new Ext.data.proxy.Ajax({model: 'User',reader: {type: 'xml',root: 'users'}});proxy.getReader(); //返回⼀个XmlReader的实例.⽣成UrlAjaxProxy会⾃动将排序,过滤,翻页和分组参数添加到⽣成的url中. 可以使⽤下⾯这些属性来配置这些参数:- 控制如何向服务器发送页数(同样参见startParam和limitParam)- 控制如何向服务器发送排序信息- 控制如何向服务器发送分组信息- 控制如何向服务器发送过滤信息每个AjaxProxy发出的请求对象由⼀个Operation对象来描述. 为了说明我们是如何⽣成⾃定义url的, 让我们看看下⾯这个Operation:var operation = new Ext.data.Operation({action: 'read',page : 2});然后我们⽤此Operation来发布请求, 通过调⽤:var proxy = new Ext.data.proxy.Ajax({url: '/users'});proxy.read(operation); //GET /users?page=2很简单吧 - Proxy代理类只需要复制Operation中的page值即可. 我们还能⾃定义如何向服务器发送page数据:var proxy = new Ext.data.proxy.Ajax({url: '/users',pageParam: 'pageNumber', //默认page});proxy.read(operation); //GET /users?pageNumber=2还有另⼀个⽅案, 可以配置Operation来发送start和limit参数代替page:var operation = new Ext.data.Operation({action: 'read',start : 50,limit : 25});var proxy = new Ext.data.proxy.Ajax({url: '/users'});proxy.read(operation); //GET /users?start=50&limit;=25同样地我们可以⾃定义startParam limitParamvar proxy = new Ext.data.proxy.Ajax({url: '/users',startParam: 'startIndex',//默认startlimitParam: 'pageSize'//默认limit});proxy.read(operation); //GET /users?startIndex=50&pageSize;=25AjaxProxy还会向服务器发送排序和过滤信息. 让我们来看看如何使⽤Operation来表⽰:var operation = new Ext.data.Operation({action: 'read',sorters: [new Ext.util.Sorter({property : 'name',direction: 'ASC'}),new Ext.util.Sorter({property : 'age',direction: 'DESC'})],filters: [new Ext.util.Filter({property: 'eyeColor',value : 'brown'})]});当使⽤⼀个包含sorters和filters参数的来加载数据时, 就会在内部⽣成上⾯这样的对象. 默认情况下, AjaxProxy 会对sorters和filters进⾏JSON转换, 从⽽得到如下结果(注意url发送前会被加密, 这⾥为便于阅读使⽤未加密的串):var proxy = new Ext.data.proxy.Ajax({url: '/users'});proxy.read(operation); //GET /users?sort=[{"property":"name","direction":"ASC"},{"property":"age","direction":"DESC"}]&filter;=[{"property":"eyeColor","value":"brown"}]同样地我们能够⾃定义这些参数项. 假设我们的服务器读取排序信息的格式是"sortBy=name#ASC,age#DESC". 我们可以像这样配置AjaxProxy来提供这种格式:var proxy = new Ext.data.proxy.Ajax({url: '/users',sortParam: 'sortBy',filterParam: 'filterBy',//我们⾃定义实现排序信息转码⽅法 - 将sorters转换为"name#ASC,age#DESC"encodeSorters: function(sorters) {var length = sorters.length,sortStrs = [],sorter, i;for (i = 0; i < length; i++) {sorter = sorters[i];sortStrs[i] = sorter.property + '#' + sorter.direction}return sortStrs.join(",");}});proxy.read(operation); //GET /users?sortBy=name#ASC,age#DESC&filterBy;=[{"property":"eyeColor","value":"brown"}]同样我们还能够通过⾃定义实现⽅法来对filters信息进⾏转码Ext.data.proxy.JsonP<script src="/users?callback=someCallback"></script>在我们注⼊了上⾯这个标签后, 浏览器就会向这个url发送⼀个请求. 通过url中的callback, 我们通知domainB的服务器: 当结果返回时请调⽤此回调函数并传⼊返回的数据. 只要服务器将响应结果组成如下格式, 调⽤就成功了:Ext.regModel("User",{fields:[{name:'name',type:'string'}],proxy:{type:'jsonp',//跨域交互的代理url:'/extjs/person.php'}});var person = Ext.ModelManager.getModel('User');person.load(1,{scope:this,success:function(model){alert(model.get('name'));}});Ext.data.proxy.LocalStorageLocalStorageProxy使⽤最新的HTML5本地数据库API, 将数据保存在本地客户端. HTML5本地数据库是⼀个键值对存储(例如不能存储像JSON这样的复杂对象), 因此LocalStorageProxy在保存和读取数据时, ⾃动进⾏序列化和反序列化.本地数据库在保存⽤户个⼈信息时⾮常有⽤, 从⽽不再需要在服务端建⽴数据结构.Ext.define('User', {fields: ['id', 'name'],extend: 'Ext.data.Model',proxy: {type: 'localstorage'}});var store = new Ext.data.Store({model:'User'});store.add({name:'somnus'});// 保存数据store.sync();// 读取数据store.load();store.each(function(record){(record.get('name'));});Ext.data.proxy.Memory内存代理. 此代理使⽤简单的本地变量进⾏数据的存储/读取, 所以其内容将在每次页⾯刷新时被清除.通常此代理并不直接使⽤, ⽽是作为Store的辅助服务对象, 为其在加载数据时提供reader对象. 例如, 假设我们有⼀个 User Model和Store, 以及⼀些我们想要加载的内部数据, 但是这些数据的格式并不是很合适: 这时我们就可以⽤⼀个带有JsonReader的MemoryProxy 来为Store读取这些数据://我们将在store中使⽤的model对象Ext.define('User', {extend: 'Ext.data.Model',fields: [{name: 'id', type: 'int'},{name: 'name', type: 'string'},{name: 'phone', type: 'string', mapping: 'phoneNumber'}]});//数据字段不是按照model中定义排列的 - 字段'phone'在此称为'phoneNumber'var data = {users: [{id: 1,name: 'Ed Spencer',phoneNumber: '555 1234'},{id: 2,name: 'Abe Elias',phoneNumber: '666 1234'}]};//请注意我们是如何通过设置reader的'root'来满⾜上⾯的数据结构的.var store = Ext.create('Ext.data.Store', {autoLoad: true,model: 'User',data : data,proxy: {type: 'memory',reader: {type: 'json',root: 'users'}}});var memoryProxy = Ext.create("Ext.data.proxy.Memory",{data:data,model:'User'})data.push({name:'sunday',age:1});memoryProxy.update(new Ext.data.Operation({action:'update',data:data}),function(result){},this);memoryProxy.read(new Ext.data.Operation(),function(result){var datas = result.resultSet.records;Ext.each(datas,function(model){(model.get('name'));});var totalRecords = result.resultSet.total;alert('读取内存数据,记录总是:' + totalRecords); });。
EXTJS框架-⼊门实例extjs框架是⼀个JavaScript框架,可以渲染出丰富的控件实例:代码:<html><head><title>test</title><link type="text/css" rel="Stylesheet" href="css/ext-all.css"/><!--<link rel="stylesheet" type="text/css" href="css/ux-all.css" /><link rel="stylesheet" type="text/css" href="css/yourtheme.css" />--><script src="js/ext-base.js" type="text/javascript"></script><script src="js/ext-all.js" type="text/javascript"></script><!--<script type ="text/javascript" src="js/ux-all.js"></script>提⽰框<script type ="text/javascript" src="js/App.js"></script>--></head><body><div style="border:4px dashed #ccc;margin:50px 50px;padding:50px 50px;">输⼊框<input id="text" /><br/>表格<div id="grid" style="height:200px;"></div><br/>表单<div id="form" style="height:120px;"></div>表单组件<div id="formGroup" ></div></div><script type="text/javascript">Ext.onReady(function () {//提⽰框//Ext.Msg.alert('<span style="color:red;">tip</span>','这个是EXTJS的demo,初始化加载⽅法都应该<span style="color:red;">写在Ext.onReady⾥⾯</span>'); //事件绑定Ext.get('text').on('keypress',enterEvent);//表格gridControl();//表单formControl();//表单组件formGroupControl();});///回车事件function enterEvent(e){if(e.charCode==Ext.EventObject.ENTER){console.log(Ext.get('text').dom.value);Ext.Msg.alert('info','hello,'+Ext.get('text').dom.value);}}//表格控件function gridControl(){//⾏号var rn=new Ext.grid.RowNumberer();//列var cm=new Ext.grid.ColumnModel([rn,{header:'编号',dataIndex:'id'},{header:'名称',dataIndex:'name',renderer:function(value){return '<span style="color:red;" onclick="e_alert(\''+value+'\')">名称是'+value+'</span>'; }},{header:'描述',dataIndex:'desc'},{header:'备注',dataIndex:'remark'}]);//数据var data=[['id','name','desc','remark'],['2','name','desc','remark'],['3','name','desc','remark'],['4','name','desc','remark'],['5','name','desc','remark'],['7','name','desc','remark'],['8','name','desc','remark'],['1','2','3','4']];var store=new Ext.data.Store({proxy:new Ext.data.MemoryProxy(data),//proxy:new Ext.data.ScriptTagProxy({url:'/data.json'}),reader:new Ext.data.ArrayReader({},[{name:'id',mapping:0},{name:'name',mapping:1},{name:'desc'},{name:'remark'}])});//⾯板var grid=new Ext.grid.GridPanel({renderTo:'grid',height:200,store:store,loadMask:true,cm:cm,viewConfig:{forceFit:true}});//加载数据store.load();}function e_alert(value){Ext.Msg.alert('info',value);}//表单function formControl(){var form=new Ext.form.FormPanel({defaultType:'textfield',labelAlign:'right',title:'form',frame:true,labelWidth:50,buttonAlign:'center',width:220,items:[{fieldLabel:'⽂本框'}],buttons:[{text:'按钮'}]});form.render('form');}//表单组件function formGroupControl(){Ext.QuickTips.init();var formGroup=new Ext.form.FormPanel({title:'form',frame:true,labelWidth:50,width:600,labelAlign:'right',buttonAlign:'center',items:[{layout:'column',items:[{title:'单纯输⼊',xtype:'fieldset',checkboxToggle:true,autoHeight:true,columnWidth:0.7,defaults:{width:300},items:[{fieldLabel:'⽂本',xtype:'textfield',name:'text'},{fieldLabel:'数字',xtype:'numberfield',name:'number'},{fieldLabel:'选择',xtype:'combo',name:'combo',store:new Ext.data.SimpleStore({ fields:['value','text'],data:[['1','2'],['aa','bb'],['aa2','bb2'],['aa3','bb3'],['hello','你好'],]}),valueField:'value',displayField:'text',mode:'local',emptyText:'请选择'},{fieldLabel:'⽇期',xtype:'datefield',name:'date'},{fieldLabel:'时间',xtype:'timefield',name:'time'},{fieldLabel:'多⾏',xtype:'textarea',name:'textarea'},]},{title:'多选',xtype:'fieldset',checkboxToggle:true,hideLabels:true,style:'margin-left:10px;',columnWidth:0.3,defaultType:'checkbox',items:[{boxLabel:'⾸先要吃饱',name:'check',value:'1',width:'auto'},{boxLabel:'然后也要吃饱',name:'check',value:'2',checked:false,width:'auto'},{boxLabel:'接着还是要吃饱',name:'check',value:'3',checked:true,width:'auto'},{boxLabel:'最后也要吃饱',name:'check',value:'4',checked:false,width:'auto'},]},{title:'单选',xtype:'fieldset',checkboxToggle:true,defaultType:'radio',style:'margin-left:10px;',columnWidth:0.3,hideLabels:true,autoHeight:true,items:[{boxLabel:'渴望⾃由',name:'rad',value:'1',checked:true,width:'auto'},{boxLabel:'祈求爱情',name:'rad',value:'2',width:'auto'}]}]},{layout:'form',labelAlign:'top',items:[{xtype:'htmleditor',fieldLabel:'在线编辑器',id:'editor',anchor:'98%'}]}],buttons:[{text:'保存'},{text:'读取'},{text:'取消'},]});formGroup.render('formGroup'); }</script></body></html>。
extjs中文APIExtjs4 学习指南(仅供学习使用、转载需注明出处)Extjs4可用的学习资料少之又少,本文内容大部分为网络整理、方便学习者使用,如有出入以extjs4 api文档为准。
Extjs初步获取Extjs下载extjs:可以从/ 获得需要的extjs发布包及更多支持。
搭建学习环境:假设您的机器已经安装myeclipse和tomcat,如果没有请参阅其他相关资料。
myeclipse建立新Web project项目Extjs4并且将extjs4.0.7压缩包解压后的全部文件复制到项目的Webroot目录下Examples目录为ext官方提供的例子程序,其中可能包涵php的代码,错误信息可以暂时不理会。
部署并且启动tomcat,测试环境是否可用。
打开浏览器,输入http://localhost:8080/Ext4/index.html假设您的tomcat端口为8080您会看到以下界面,证明环境已经搭建成功!查看api文档http://localhost:8080/Ext4/docs/index.html查看示例页面http://localhost:8080/Ext4/examples/index.html测试例子开始...Webroot目录下建立hellowword.js 输入如下内容:再建立一个helloword.html,输入如下内容Html文件中只引入了一个css和2个js文件,注意引用路径和你建立文件路径是否能匹配,如果路径没有问题的话,打开浏览器输入http://localhost:8080/Ext4/helloworld.html您将会看到浏览器里显示一个panel,标题是Hello Ext,内容Hello! Welcome to Ext JS.,如果没有,请查看是否有路径不匹配。
其他:在ExtJS里最常用的,应该就是Ext.onReady和Ext.application这两个个方法了,而且它也可能是你学习ExtJS所接触的第一个方法,这个方法在当前的DOM加载完毕后自动调用,保证页面内的所有元素都能被Script所引用.可以尝试在这个方法中添加一条语句,看看页面打开后是什么反映(先建立js和html文件,将如下代码加入js文件中,html文件相应引入对应的js文件,本文档所有示例代码均如此方式运行以下不再重复)上面的代码将在页面加载完毕后弹出一对话框,打印出'hello world!'字样.获取元素还有一个常用的方法,就是获取页面上的元素了,ExtJS提供了一个get方法,可以根据ID取到页面上的元素:var myDiv = Ext.get('myDiv');会取到页面上ID为'myDiv'的元素.如果使用Element.dom的方法,则可以直接操作底层的DOM节点,Ext.get返回的则是一个Element对象.在不能使用这种方式来获取多个DOM的节点,或是要获取一些ID不一致,但又有相同特征的时候,可以通过选择器来进行获取,比如要获取页面上所有的标签,则可以使用:var ps = Ext.select('p');这样你就可以对所要获取的元素进行操作了,select()方法返回的是positeElement 对象,可以通过其中的each()方法对其所包含的节点进行遍历:当然,如果你要是对获取的所有元素进行相同的操作,可以直接应用于CompositeElement对象上,如:ps.highlight();或是:Ext.select('p').highlight();当然,select参数还可以更复杂一些,其中可以包括W3C Css3Dom选取器,基本的XPath,HTML 属性等,详细情况,可以查看DomQuery API的文档,来了解细节.事件响应获取到了元素,则可能会对一些元素的事件进行一些处理,比如获取一个按钮,我们为它添加一个单击事件的响应:复制代码代码如下:当然,你可以把事件的响应加到通过select()方法获取到的元素上:复制代码代码如下:WidgetsExtJS还提供了丰富的UI库来供大家使用.Extjs4布局详解Fit布局在Fit布局中,子元素将自动填满整个父容器。
这一个别指导最与相关?Ext 设计者,1. x。
Ext 设计者是作什么的?和设计者建筑网络应用UI和设计者展开UI 成份对数据连接输出一个计画Ext 设计者是作什么的?设计者为Ext JS 网络申请是图解式使用者接口建立者。
它的简单易用累赘和下降环境促使你很快地设计原型你的申请接口成份,把接口成份连结到你的数据,而且为每个成份输出很好形成、物体导向的密码。
程序师和非程序师一样能使用设计者在帮助使更快速地被开始而且使较快速的重复成为可能的计画的申请设计上合作。
与设计者在一起,你能:很快地而且容易地建立复杂的表格。
变化成份地面区划和以货易货控制用钮扣的点击的类型。
关于写落实密码、,而非样板文件UI 密码的焦点。
另外数据对于关于设计者和Ext JS 的较多资讯:看这?设计者示范?对于对设计者的快介绍。
对于关于的资讯最近的设计者释放和更新,见到这?设计者Changelog。
如果你对Ext JS 很新,见到成份和容器模型数据在这?Ext JS 概观。
为关于任何Ext JS 班级或方法的细节,见到这?Ext JS 美国石油协会叁考。
和设计者建筑网络应用UI设计者被设计连同你的现有发展环境和工具被用。
它不是日蚀或你的喜爱本文编者的一个替换。
被设计者产生的密码能进入你的现有IDE 之内被进口,而且你能在你的IDE 之内的设计者的外面或与你的选择的编者编辑UI 落实文件。
当使用设计者,你:在设计者帆布上展开你的UI 成份。
配置成份。
连接到你的数据商店。
输出你的计画。
实现你的事件处理和习惯方法在这产生。
js 申请。
重要的!?当你第一次输出你的计画,两个Javascript 文件为你的计画的每个最高阶层的成份被产生。
文件与这。
ui.js 延长为UI 成份包含恶劣的班级。
你在文件中扩充这一个基础班级与这。
js 延长实现你的事件操作者和订制的功能。
不要修正这。
ui.js 文件直接地,每当你修正并且输出你的计画,它将会重写。
Extjs4.1中布局的组合使用Extjs4.1中布局很经典,也很好用,关键是如何组合布局,组合布局,不仅要达到我们想要的界面效果,还要注意因为布局所付出的渲染代价。
下面是我经过反复调试,总结的最常用也很高效的几种组合布局,废话不多说,先看其中一个效果图:因为Extjs布局本身并没有难度,我也没必要在这浪费口舌说些没用的知识点,下面是详细代码,复制粘贴就可以直接运行(注意引入extjs的包).相信效果会吓你一跳。
<body><script language="javascript">$(document).ready(function(){Ext.onReady(function(){Ext.require([//'Ext.form.*',//'yout.container.Column',//'Ext.tab.Panel''*']);Ext.onReady(function() {Ext.QuickTips.init();var bd = Ext.getBody();/** ================ Simple form =======================*/bd.createChild({tag: 'h2', html: 'Form 1 - Very Simple'});var required = '<span style="color:red;font-weight:bold" data-qtip="Required">*</span>';var simple = Ext.widget('form',{layout: 'form',collapsible: true,id: 'simpleForm',url: 'save-form.php',frame: true,title: 'Simple Form',bodyPadding: '5 5 0',width: 350,fieldDefaults: {msgTarget: 'side',labelWidth: 75},defaultType: 'textfield',items: [{fieldLabel: 'First Name',afterLabelTextTpl: required,name: 'first',allowBlank: false},{fieldLabel: 'Last Name',afterLabelTextTpl: required,name: 'last',allowBlank: false},{fieldLabel: 'Company',name: 'company'}, {fieldLabel: 'Email',afterLabelTextTpl: required,name: 'email',allowBlank: false,vtype:'email'}, {fieldLabel: 'DOB',name: 'dob',xtype: 'datefield'}, {fieldLabel: 'Age',name: 'age',xtype: 'numberfield',minValue: 0,maxValue: 100}, {xtype: 'timefield',fieldLabel: 'Time',name: 'time',minValue: '8:00am',maxValue: '6:00pm'}],buttons: [{text: 'Save',handler: function() {this.up('form').getForm().isValid();}},{text: 'Cancel',handler: function() {this.up('form').getForm().reset();}}]});simple.render(document.body);/** ================ Form 2 ======================= */bd.createChild({tag: 'h2', html: 'Form 2 - Adding fieldsets'}); var fsf = Ext.widget({xtype: 'form',id: 'fieldSetForm',collapsible: true,url: 'save-form.php',frame: true,title: 'Simple Form with FieldSets',bodyPadding: '5 5 0',layout: 'anchor',width: 350,fieldDefaults: {msgTarget: 'side',labelWidth: 75},defaults: {anchor: '100%'},items: [{xtype:'fieldset',checkboxToggle:true,title: 'User Information',defaultType: 'textfield',collapsed: true,layout: 'anchor',defaults: {anchor: '100%'},items :[{fieldLabel: 'First Name',afterLabelTextTpl: required,name: 'first',allowBlank:false},{fieldLabel: 'Last Name',afterLabelTextTpl: required,name: 'last'},{fieldLabel: 'Company',name: 'company'}, {fieldLabel: 'Email',afterLabelTextTpl: required,name: 'email',vtype:'email'}]},{xtype:'fieldset',title: 'Phone Number',collapsible: true,defaultType: 'textfield',layout: 'anchor',defaults: {anchor: '100%'},items :[{fieldLabel: 'Home',name: 'home',value: '(888) 555-1212'},{fieldLabel: 'Business',name: 'business'},{fieldLabel: 'Mobile',name: 'mobile'},{fieldLabel: 'Fax',name: 'fax'}]}],buttons: [{text: 'Save'},{text: 'Cancel'}]});fsf.render(document.body);/** ================ Form 3 ======================= */bd.createChild({tag: 'h2', html: 'Form 3 - A little more complex'}); var top = Ext.widget({xtype: 'form',id: 'multiColumnForm',collapsible: true,frame: true,title: 'Multi Column, Nested Layouts and Anchoring',bodyPadding: '5 5 0',width: 600,fieldDefaults: {labelAlign: 'top',msgTarget: 'side'},items: [{xtype: 'container',anchor: '100%',layout: 'hbox',items:[{xtype: 'container',flex: 1,layout: 'anchor',items: [{xtype:'textfield',fieldLabel: 'First Name',afterLabelTextTpl: required,allowBlank: false,name: 'first',anchor:'95%',value: 'Don'}, {xtype:'textfield',fieldLabel: 'Company',name: 'company',anchor:'95%'}]},{xtype: 'container',flex: 1,layout: 'anchor',items: [{xtype:'textfield',fieldLabel: 'Last Name',afterLabelTextTpl: required,allowBlank: false,name: 'last',anchor:'100%',value: 'Griffin'},{xtype:'textfield',fieldLabel: 'Email',afterLabelTextTpl: required,allowBlank: false,name: 'email',vtype:'email',anchor:'100%'}]}]}, {xtype: 'htmleditor',name: 'bio',fieldLabel: 'Biography',height: 200,anchor: '100%'}],buttons: [{text: 'Save',handler: function() {this.up('form').getForm().isValid();}},{text: 'Cancel',handler: function() {this.up('form').getForm().reset();}}]});top.render(document.body);/** ================ Form 4 =======================*/bd.createChild({tag: 'h2', html: 'Form 4 - Forms can be a TabPanel...'}); var tabs = Ext.widget({xtype: 'form',id: 'tabForm',width: 350,border: false,bodyBorder: false,fieldDefaults: {labelWidth: 75,msgTarget: 'side'},items: {xtype:'tabpanel',activeTab: 0,defaults:{bodyPadding: 10,layout: 'anchor'},items:[{title:'Personal Details',defaultType: 'textfield',defaults: {anchor: '100%'},items: [{fieldLabel: 'First Name',name: 'first',afterLabelTextTpl: required,allowBlank: false,value: 'Ed'},{fieldLabel: 'Last Name',afterLabelTextTpl: required,allowBlank: false,name: 'last',value: 'Spencer'},{fieldLabel: 'Company',name: 'company',value: 'Ext JS'}, {fieldLabel: 'Email',afterLabelTextTpl: required,allowBlank: false,name: 'email',vtype:'email'}]},{title: 'Phone Numbers',defaultType: 'textfield',defaults: {anchor: '100%'},items: [{fieldLabel: 'Home',name: 'home',value: '(888) 555-1212'},{fieldLabel: 'Business',name: 'business'},{fieldLabel: 'Mobile',name: 'mobile'},{fieldLabel: 'Fax',name: 'fax'}]}]},buttons: [{text: 'Save',handler: function() {this.up('form').getForm().isValid();}},{text: 'Cancel',handler: function() {this.up('form').getForm().reset();}}]});tabs.render(document.body);/** ================ Form 5 =======================*/bd.createChild({tag: 'h2', html: 'Form 5 - ... and forms can contain TabPanel(s)'}); var tab2 = Ext.widget({title: 'Inner Tabs',xtype: 'form',id: 'innerTabsForm',collapsible: true,bodyPadding: 5,width: 600,fieldDefaults: {labelAlign: 'top',msgTarget: 'side'},defaults: {anchor: '100%'},items: [{xtype: 'container',layout:'hbox',items:[{xtype: 'container',flex: 1,border:false,layout: 'anchor',defaultType: 'textfield',items: [{fieldLabel: 'First Name',afterLabelTextTpl: required,allowBlank: false,name: 'first',anchor:'95%'}, {fieldLabel: 'Company',name: 'company',anchor:'95%'}]},{xtype: 'container',flex: 1,layout: 'anchor',defaultType: 'textfield',items: [{fieldLabel: 'Last Name',afterLabelTextTpl: required,allowBlank: false,name: 'last',anchor:'95%'},{fieldLabel: 'Email',afterLabelTextTpl: required,allowBlank: false,name: 'email',vtype:'email',anchor:'95%'}]}]},{xtype:'tabpanel',plain:true,activeTab: 0,height:235,defaults:{bodyPadding: 10},items:[{title:'Personal Details',defaults: {width: 230},defaultType: 'textfield',items: [{fieldLabel: 'First Name',name: 'first',value: 'Jamie'},{fieldLabel: 'Last Name',name: 'last',value: 'Avins'},{fieldLabel: 'Company',name: 'company',value: 'Ext JS'}, {fieldLabel: 'Email',name: 'email',vtype:'email'}]},{title:'Phone Numbers',defaults: {width: 230},defaultType: 'textfield',items: [{fieldLabel: 'Home',name: 'home',value: '(888) 555-1212'},{fieldLabel: 'Business',name: 'business'},{fieldLabel: 'Mobile',name: 'mobile'},{fieldLabel: 'Fax',name: 'fax'}]},{cls: 'x-plain',title: 'Biography',layout: 'fit',items: {xtype: 'htmleditor',name: 'bio2',fieldLabel: 'Biography'}}]}],buttons: [{text: 'Save',handler: function() {this.up('form').getForm().isValid();。
ExtJs2.0学习系列(1)--Ext.MessageBox大家都知道,刚开始搞extjs的时候,很是有点困难,所以本人在新手刚入门后准备了这个系列的文章.个人认为用extjs做后台很不错,布局比较完美!1.Ext.MessageBox.alert()有四个参数,为简单起见,主要介绍前面三个参数:alert( title , msg , function(){} );其中title,msg为必选参数,function为可选参数,在关闭弹出窗口后触发.【注意】Ext.MessageBox.alert("title","msg",function(e){alert("按钮的值:"+e);});参数e: 两种值 (ok,cancel).2.Ext.MessageBox.confirm()基本上同 alert() 方法一模一样.【注意】Ext.MessageBox.confirm("title","msg",function(e){alert("按钮的值:"+e);});参数e:三种值(yes,no,cancel).3.Ext.MessageBox.prompt()有六个参数,比前面alert方法多一个返回值和是否多行.Ext.MessageBox.prompt("title","msg");【注意】e是按钮返回值,text是文本框中的输入内容,true为多行,this表示作用域4.Ext.MessageBox.show()功能很强大,采用config配置形式,比前面的方法使用更方便.参数很多,在此列举最常用的配置参数:a)animEl:对话框弹出和关闭时的动画效果,比如设置为”id1”,则从id1处弹出并产生动画,收缩则相反;b)buttons:弹出框按钮的设置,【Ext.Msg.OK】【Ext.Msg.OKCANCEL】【Ext.Msg.CAMCEL】【Ext.Msg.YESNO】【Ext.Msg.YESNOCANCEL】可以自定义按钮上面的字:{"ok","我本来是ok的"},若设为false,则不显示任何按钮,默认为false.c)closable:如果为false,则不显示右上角的小叉叉,默认为true;d)msg:消息的内容;e)title:标题;f)fn:关闭弹出框后执行的函数;g)icon:弹出框内容前面的图标,【】【Ext.MessageBox.ERROR】【Ext.MessageBox.WARNING】【Ext.MessageBox.QUESTION】h)width:弹出框的宽度,不带单位;i)prompt:设为true,则弹出框带有输入框,默认为false;j)multiline:设为true,则弹出框带有多行输入框k)progress:设为true,显示进度条,(但是是死的)l)progressText:显示在进度条上的字m)wait:设为true,动态显示progress5.Ext.MessageBox.show()中的进度条的使用首先必须知道另外两个方法 Ext.MessageBox.hide()和Ext.MessageBox.updateProgress(value,"ProgressText","msg")(三个参数,看名字就知道意思), 【注意】value为0-1之间的数,表示进度条的进度.第一种:(通过进度的大小控制进度,满进度为1)Ext.get("btn1").on("click",function(){Ext.MessageBox.show({title:"df",msg:"dfd",progress:true,width:300,closable:true});var f=function(v){return function(){if(v==12) {Ext.MessageBox.hide();}Else{var i=v/11;Ext.MessageBox.updateProgress(i,Math.round(100*i)+"% completed",i);}}}for(var i=1;i<13;i++){setTimeout(f(i),i*500);//从点击时就开始计时,所以500*i表示每500ms就执行一次}});第二种:(通过固定时间控制进度加载)最后关于那个waitConfig的参数,在此说明下:a)interval:进度的频率b)duration:执行进度的持续时间,超过这个时间后,interval失效,不再产生进度效果,但进度狂也不会消失.c)fn:duration的时间到后执行的函数所以,上面的通过时间控制进度另外一种写法为:Ext.get("btn1").on("click",function(){Ext.MessageBox.show({title:"时间进度条",msg:"5s后关闭进度框",progress:true,width:300,wait:true,waitConfig:{interval:600,duration:5000,fn:function(){Ext.MessageBox.hide();//让进度条消失}},closable:true});//setTimeout(function(){Ext.MessageBox.hide()},5000);});ExtJs2.0学习系列(2)--Ext.Panel今天介绍 extjs 中的 Panel 组件.因为panel组件的子类组件包括TabPanel,GridPanel,FormPanel,TreePanel 组件,所以非常有必要介绍Panel组件的配置参数和相关的属性、方法.//配置参数(只列举部分常用参数)a)autoLoad:有效的url字符串,把那个url中的body中的数据加载显示,但是可能没有样式和js控制,只是html数据b)autoScroll:设为true 则内容溢出的时候产生滚动条,默认为falsec)autoShow:设为true显示设为"x-hidden"的元素,很有必要,默认为falsed)bbar:底部条,显示在主体内, //代码:bbar:[{text:'底部工具栏bottomToolbar'}]e)tbar:顶部条,显示在主体内, //代码:tbar:[{text:'顶部工具栏topToolbar'}]f)buttons:按钮集合,自动添加到footer中(footer参数,显示在主体外)// 代码 :buttons:[{text:"按钮位于footer"}]g)buttonAlign:footer中按钮的位置,枚举值为:"left","right","center",默认为righth)collapsible:设为true,显示右上角的收缩按钮,默认为falsei)draggable:true则可拖动,但需要你提供操作过程,默认为falsej)html:主体的内容k)id:id值,通过id可以找到这个组件,建议一般加上这个id值l)width:宽度m)height:高度n)title:标题o)titleCollapse:设为true,则点击标题栏的任何地方都能收缩,默认为false.p)applyTo:(id)呈现在哪个html元素里面q)contentEl:(id)呈现哪个html元素里面,把el内的内容呈现r)renderTo:(id)呈现在哪个html元素里面// 关于这三个参数的区别(个人认为:applyTo和RenderTo强调to到html元素中,contentEl则是html元素到ext组件中去);关于contentEl有资料如下:ContentEl - This config option is used to take existing content and place it in the bo dy of a new panel. It is not going to be the actual panel itself. (It will actually copy the innerHTML of the el and use it for the body). You should add either the x-hidden or t he x-hide-display CSS class to prevent a brief flicker of the content before it is render ed to the panel.ApplyTo - This config option allows you to use pre-defined markup to create an entire Panel. By entire, I mean you can include the header, tbar, body, footer, etc. These elements must be in the correct order/hierarchy. Any components which are not found and need t o be created will be autogenerated.RenderTo - This config option allows you to render a Panel as its created. This would be the same as saying myPanel.render(ELEMENT_TO_RENDER_TO);考虑到入门,方法事件会在以后的文章中以实例穿插.1.可拖动的panel实例下面我们做个可拖动panel例子来熟悉下panel这个最基本的组件.但是还不能拖到其他的地方,我们需要改写draggable:实现了可保存的拖动,如图:拖动的时候阴影还在原位置,我们再在draggable中的onDrag事件中添加代码:最后这个可拖动的panel的代码为:var p=new Ext.Panel({title: 'Drag me',x: 100,y: 100,renderTo: Ext.getBody(),floating: true,frame: true,width: 400,height: 200,draggable: {insertProxy: false,onDrag : function(e){var pel = this.proxy.getEl();this.x = pel.getLeft(true);this.y = pel.getTop(true);var s = this.panel.getEl().shadow;if (s) {s.realign(this.x, this.y, pel.getWidth(), pel.getHeight());}},endDrag : function(e){this.panel.setPosition(this.x, this.y);}}})2.带顶部,底部,脚部工具栏的panel我们已经在各种工具栏上添加了按钮,但是却没有激发事件,下面我们来添加按钮事件代码:改写tbar,添加handler句柄,点击顶部工具栏上按钮1,弹出提示框,效果图大家想象下,就不贴出来了当然,一般情况下,我们只要一个工具栏,这里只是为了演示!3.panel工具栏添加下面的代码到panel配置参数中:id的枚举值为:toggle (collapsable为true时的默认值)close minimize maximize restore gear pinunpin right left up down refreshminus plus help search save printExtJs2.0学习系列(3)--Ext.Window介绍window组件,它继承自panel.先介绍个最简单例子参数介绍:因为前面已经介绍了panel组件,下面只介绍window组件的几个其他特别的配置参数//几个前面没有介绍的window自己的配置参数a)closeAction:枚举值为:close(默认值),当点击关闭后,关闭window窗口,关闭后,只是hidden窗口b)closable:true在右上角显示小叉叉的关闭按钮,默认为truec)constrain:true则强制此window控制在viewport,默认为falsed)modal:true为模式窗口,后面的内容都不能操作,默认为falsee)plain://true则主体背景透明,false则主体有小差别的背景色,默认为falsew.show()//需要显示下show()方法,默认的窗口是可拖动的,可关闭的,可拖动大小的实例介绍:1.嵌套了tabpanel的window我们通过items把TabPanel组件嵌套在window的主体中去了.我们再添加工具栏看看其他工具栏方法一样.关于window中嵌套复杂的布局,等我们谈完了extjs布局再举例说明.ExtJs2.0学习系列(4)--Ext.FormPanel之第一式上篇中我们讨论了Ext.window的简单使用,今天我们要看看强大的FormPanel,也是继承panel组件的使用. 首先弄清楚这个问题,创建的时候:Ext.form.FormPanel = Ext.FormPanel;//查看源代码便知,两种方法是一样的我们还是从最简单的代码实例开始吧:<!--html代码--><div id="form1"></div>//js代码var form1 = new Ext.form.FormPanel({width:350,frame:true,//圆角和浅蓝色背景renderTo:"form1",//呈现在哪个控件里title:"FormPanel",bodyStyle:"padding:5px 5px 0",items:[{fieldLabel:"UserName",//文本框标题xtype:"textfield", //表单文本框name:"user",id:"user",width:200},{fieldLabel:"PassWord",xtype:"textfield",name:"pass",id:"pass",width:200}],buttons:[{text:"确定"},{text:"取消",handler:function(){alert("事件!");}}] });都是通过items属性参数把表单元素添加到这个表单中.我们发现两个文本框的类型和宽度是一样的,我们还可以把items里面的相同项提取出来,以简化代码:关于inputType参数(同input类型相同,只列举几个典型的)如下:radio check text(默认) file password等等关于FormPanel的配置参数,请主要参考panel的参数,这里列举另外两个:a)labelAlign:fieldlabel的排列位置,默认为"left",其他两个枚举值是"center","right"b)labelWidth:fieldlabel的占位宽c)method:"get"或"post"d)url:"提交的地址"e)submit:提交函数因为内容太多,我们先看一个例子.1.FormPanel的fieldset应用//把前面代码重写items属性items:[{xtype:'fieldset',title: '个人信息',collapsible: true,autoHeight:true,width:330,defaults: {width: 150},defaultType: 'textfield',items :[{fieldLabel: '爱好',name: 'hobby',value: ''},{xtype:"combo",name: 'sex',store:["男","女","保密"],//数据源为一数组fieldLabel:"性别",emptyText:'请选择性别.'}]}]这里的combox组件只是简单的演示,具体还是要深入了解,我们会在以后的内容中详细探讨.2.关于xtype的类型,在extjs的form表单(其他的请参考api)中已经定义的有:Form componentsa)form Ext.FormPanelb)checkbox Ext.form.Checkboxc)combo boBoxd)datefield Ext.form.DateFielde)field Ext.form.Fieldf)fieldset Ext.form.FieldSetg)hidden Ext.form.Hiddenh)htmleditor Ext.form.HtmlEditori)label belj)numberfield Ext.form.NumberFieldk)radio Ext.form.Radiol)textarea Ext.form.TextAream)textfield Ext.form.TextFieldn)timefield Ext.form.TimeFieldo)trigger Ext.form.TriggerField不早了,FormPanel还有很多的东西要了解,但是今天不能再讲了,太多了,大家都没有兴致看下去,明天继续.extjs的东西很庞大,但是还没有一个人用中文系统的分析写文章,所以资料都很可贵,现在我想做这件事,请大家多多支持,我才有动力.ExtJs2.0学习系列(5)--Ext.FormPanel之第二式3.可选的fieldset实例其实就是带个chechbox,有点像论坛注册时有一部分是选填信息的那种效果,主要知识点:●checkboxToggle:true//true则呈现一个带checkbox的fieldset,选中则展开,否则相反,默认为false●checkboxName:string//当上面为true时,作为checkbox的name,方便表单操作//在上一节的基础代码的items里面添加如下配置{xtype:"fieldset",checkboxToggle:true,//关键参数,其他和以前的一样checkboxName:"dfdf",title:"选填信息",defaultType:'textfield',width:330,autoHeight:true,//使自适应展开排版items:[{fieldLabel:"UserName",name:"user",anchor:"95%"//330px-labelWidth剩下的宽度的95%,留下5%作为后面提到的验证错误提示},{fieldLabel:"PassWord",inputType:"password",//密码文本name:"pass",anchor:"95%"}]}4.表单验证实例(空验证,密码确认验证,email验证)我们可以用单独的js写表单验证,但是extjs已经为我们想到了(自己单独写反而不方便).在验证之前,我不得不提两个小知识点(大家在很多的extjs代码中都看到了这两个,他们都起提示作用的): ●Ext.QuickTips.init(); //支持tips提示●Ext.form.Field.prototype.msgTarget='side';//提示的方式,枚举值为"qtip","title","under","side",id(元素id)//side方式用的较多,右边出现红色感叹号,鼠标上去出现错误提示,其他的我就不介绍了,可自行验证大家可以分别去掉这两行代码,看效果就会明白他们的作用,(放在onReady的function(){}中)✧我们看一个最简单的例子:空验证(其实这不算是一个专门的验证例子)//空验证的两个参数a)allowBlank:false//false则不能为空,默认为trueb)blankText:string//当为空时的错误提示信息js代码为:✧用vtype格式进行简单的验证.在此举邮件验证的例子,重写上面代码的items配置:你可以修改上面的vtype为以下的几种extjs的vtype默认支持的验证:●alpha //只能输入字母,无法输入其他(如数字,特殊符号等)●alphanum//只能输入字母和数字,无法输入其他●email//email验证,要求的格式是langsin@●url//url格式验证,要求的格式是✧确认密码验证(高级自定义验证)前面的验证都是extjs已经提供的验证,我们也可以自定义验证函数,比上面要复杂点了.我们一起做一个密码确认的例子.我们修改前面的代码://先用Ext.apply方法添加自定义的password验证函数(也可以取其他的名字)Ext.apply(Ext.form.VTypes,{password:function(val,field){//val指这里的文本框值,field指这个文本框组件,大家要明白这个意思if(field.confirmTo){//confirmTo是我们自定义的配置参数,一般用来保存另外的组件的id值var pwd=Ext.get(field.confirmTo);//取得confirmTo的那个id的值return (val==pwd.getValue());}return true;}});//配置items参数items:[{fieldLabel:"密码",id:"pass1",anchor:"90%"},{fieldLabel:"确认密码",id:"pass2",vtype:"password",//自定义的验证类型vtypeText:"两次密码不一致!",confirmTo:"pass1",//要比较的另外一个的组件的idanchor:"90%"}]关于vtype的内容还有很多内容要挖掘,但现在我们就点到这里为止,以后有机会再讨论它的其他高级验证.ExtJs2.0学习系列(6)-- Ext.FormPanel之第三式(ComboBox篇)上篇ExtJs2.0学习系列(5)--Ext.FormPanel之第二式中我们讨论了下fieldset和表单验证的知识,今天我们接着深入解析表单元素中ComboBox组件的使用.会涉及到.net简单服务器数据交互,但暂不做深入讨论,以后会详细分析服务器交互相关,不过可能要等较长一段时间,呵呵!5.服务器数据作为ComboBox的数据源实例首先从服务器获取json数据:我们就通过<%=ServerData%>这样的方式获取到了服务器最简单的属性数据.问题来了,js和html怎么调用c#后台的变量和方法?(变量的调用上面刚刚介绍)6.js和html怎么调用c#后台的变量和方法a)js调用c#后台变量,参考上面,注意,如果想获取string类型,请在js里用引号 varstr="<%=ServerData%>"(返回"['湖北','江西','安徽']")b)js调用c#后台方法:c)js调用c#后台带参数的方法boBox的数据源store格式详解在前面的例子里面,我们一直给ComboBox的数据源store赋值一维数组,其实store支持多维和Store.data.Store类型.下面就几种数据以代码举例说明一维数组:["江西","湖北"],值同时赋给ComboBox的value和text二维和多维数组:[["one","bbar","111"],["two","tbar","222"]],第一维和第二维分别赋值给value和text,其他维忽略store类型:包括GroupingStore, JsonStore, SimpleStore.我们分三步走:这里我们介绍了两个新的参数displayField和mode,请记住,后面不再专门说明.boBox的value获取添加listeners事件:ComboBox的事件很多(api),我们无法一一讲解,但是我们可以举一反三,select事件就是其中典型的一个这里我们提供了一种不是很好的方法,在此不做过多停留9.把Extjs的ComboBox样式应用到select的下拉框中去核心参数介绍transform:id//用于转换样式的,TimeField作为ComboBox的子类也有此属性核心代码:boBox的其他重要参数a)valueField:"valuefield" //value值字段b)displayField:"field" //显示文本字段c)editable:false //false则不可编辑,默认为trued)triggerAction:"all"//请设置为"all",否则默认为"query"的情况下,你选择某个值后,再此下拉时,只出现匹配选项,如果设为"all"的话,每次下拉均显示全部选项e)hiddenName:string //真正提交时此combo的name,请一定要注意f)typeAhead:true, //延时查询,与下面的参数配合g)typeAheadDelay:3000, //默认250关于combobox的其他花俏功能在此不多做介绍.最后一点,如何实现在aspx页面更灵活的分离cs数据和js数据的交互?因为我们都喜欢把js放在一个单独的文件,然后在aspx页面引用这样就有一个问题,我在js里直接获取cs数据就有点不方便.我认为可以这样,在aspx页面里获取数据,并作为js,你就js变量,你就可以在js里引用了,或者直接通过url地址获取.之所以这么啰嗦的讲combobox,是因为这个东西有时候真的让人又爱又恨!下篇中我们继续讲解form中其他的表单元素!ExtJs2.0学习系列(7)--Ext.FormPanel之第四式(其他组件示例篇) 11.checkbox简单示例效果图:js代码:Ext.onReady(function(){Ext.QuickTips.init();var myform=new Ext.FormPanel({frame:true,width:330,layout:"form",labelWidth:30,title:"checkbox简单示例",labelAlign:"left",renderTo:Ext.getBody(),items:[{xtype:"panel",layout:"column",//也可以是table,实现多列布局fieldLabel:'爱好',isFormField:true,//非常重要,否则panel默认不显示fieldLabelitems:[{columnWidth:.5,//宽度为50%xtype:"checkbox",boxLabel:"足球",//显示在复选框右边的文字name:""},{columnWidth:.5,xtype:"checkbox",boxLabel:"篮球",name:""}]}]});});关于多列布局,我们可以使用column或者table布局解决!a)checked:true//true则选中,默认为falseb)name:"**"//name值c)value:""//初始化值,默认为undefine12.radio简单示例基本上和checkbox一样,不过注意一组单选框必须name值相同,才能单选.效果图:代码:Ext.QuickTips.init();var myform=new Ext.FormPanel({frame:true,width:330,layout:"form",labelWidth:30,title:"radio简单示例",labelAlign:"left",renderTo:Ext.getBody(),items:[{xtype:"panel",layout:"column",fieldLabel:'性别',isFormField:true,items:[{columnWidth:.5,xtype:"radio",boxLabel:"男",name:"sex"//inputValue},{columnWidth:.5,checked:true,xtype:"radio",boxLabel:"女",name:"sex"}]}]});});13.htmleditor简单示例效果图:frame:true,width:600,layout:"form",labelWidth:50,title:"htmleditor简单示例",labelAlign:"top",//items中的标签的位置renderTo:Ext.getBody(),items:[{xtype:"htmleditor",id:"he",fieldLabel:"编辑器",anchor:"99%"}]});});在这里我啰嗦个参数:labelAlign:此参数是指form表单中items各项的label位置,默认值为left,枚举值有left,right,top 我看见过有朋友认为此参数指title的位置,是错误的!几个其他的参数:a)hideLabel:true//默认为false,还适用于有标签的所有表单组件//下面的一组参数控制编辑器的工具栏选项,都是默认值为trueb)enableColors:true//默认为true,显示字体颜色,字体背景颜色c)enableAlignments:true//左,中,右对齐d)enableFont:true//字体e)enableFontSize:false//字体大小,就是A旁边有个小箭头的f)enableFormat:false//粗体,斜体,下划线g)enableLinks:true//链接h)enableLists:true//列表i)enableSourceEdit:true//源代码编辑14.datefield简单示例效果图:15.timefield简单示例把上面的例子中datefield改为timefield,效果图:16.numberfield简单示例:把上面的datefield改为numberfield,就只能输入数字了17.triggerfield简单示例说明:它提供了一个触发的事件onTriggerClick,datefield和combox都是继承它效果图:(点击右边下拉按钮)js代码:Ext.onReady(function(){Ext.QuickTips.init();var myform=new Ext.FormPanel({frame:true,width:200,layout:"form",labelWidth:30,title:"triggerfield简单示例",labelAlign:"left",renderTo:Ext.getBody(),items:[{xtype:"trigger",fieldLabel:"触发",anchor:"99%",onTriggerClick:function(e){//在这里写你要实现的事件,很容易扩展alert("");}}]});});好了,关于form的几个基本组件我们都蜻蜓点水的看了一遍,相信大家感性上知道是怎么回事啦!(总算快写完了formpanel)前面有朋友说要做个一行多个控件,中间有文字的那种form布局,谢谢支持!下篇我们就做一个复杂点的form组件,还能提交服务器的综合示例!敬请期待!ExtJs2.0学习系列(8)--Ext.FormPanel之第五式(综合篇)在上篇和前面的介绍中,我们基本上对form表单中常见组件有了简单的认识,今天我们做个综合点的例子,向服务器提交下!其实这篇文章很简单,没有什么发光点,暂放首页半天,忘各位理解!先来个简单的例子,以说明formpanel如何把数据传给其他页面.效果图:现在我们要实现的效果是:点击确定,把值传到另一页面!,如下:原页面js代码为:Ext.onReady(function(){Ext.QuickTips.init();var form=new Ext.FormPanel({frame:true,width:300,//monitorValid:true,//绑定验证layout:"form",labelWidth:70,title:"添加个人信息",labelAlign:"left",renderTo:Ext.getBody(),submit: function(){this.getEl().dom.action = 'GetForm.aspx',this.getEl().dom.method='POST',this.getEl().dom.submit();},items:[{xtype:"textfield",fieldLabel:"用户名",//id:"UserName",allowBlank:false,blankText:"不能为空,请正确填写",name:"UserName",anchor:"90%"},{接受页面GetForm.aspx的cs代码为:因为很简单,我做个简要说明://几点说明1.首先定义submit参数的执行函数,即:2.为按钮添加触发相应的提交(取消)事件(这样就不是默认的ajax提交):3.如果你想绑定验证,在form表单添加参数monitorValid:true,然后在按钮配置参数中添加formBind:true,如buttons:[{text:"确定",handler:login,formBind:true},{text:"取消",handler:reset}]则只有所有的填写字段都满足条件时,"确定"方可提交!如下图,好了,一个简单的formpanel的提交的原理弄清楚啦!有关form提交数据的方法有多种,大家可以参考/showtopic-55.aspx(三种ext提交数据的方式),下面我们来做个复杂点(只是样子)的form,示例一下(还是上面的原理)!效果图:传到GetForm.aspx页面后显示:不过在传过来的页面要记得ValidateRequest="false",安全编码我就暂且不讨论了!js代码:frame:true,width:500,monitorValid:true,//把有formBind:true的按钮和验证绑定layout:"form",labelWidth:55,title:"添加个人信息",labelAlign:"right",renderTo:Ext.getBody(),submit: function(){this.getEl().dom.action = 'GetForm.aspx',this.getEl().dom.method='POST',this.getEl().dom.submit();},items:[{xtype:"panel",layout:"column",fieldLabel:"用户名",isFormField:true,items:[{columnWidth:.5,xtype:"textfield",allowBlank:false,blankText:"不能为空,请填写",name:"UserName",anchor:"90%"},{columnWidth:.20,layout:"form",labelWidth:40,labelAlign:"right",items:[{xtype:"radio",fieldLabel:"性别",boxLabel:"男",name:"Sex",checked:true,inputValue:"man",//这里如果用value,值是on,所以用inputValue(出现这种情况的是radio,checkbox)anchor:"95%"}]},{columnWidth:.30,layout:"form",labelWidth:1,//让标签宽度为很小的值(奇怪的是为0时反而不行)items:[{xtype:"radio",boxLabel:"女",labelSeparator:"",//去除分隔符”:”name:"Sex",inputValue:"woman",anchor:"95%"}]}]},{//上面是第一行xtype:"panel",layout:"column",fieldLabel:"出生日期",isFormField:true,items:[{columnWidth:.5,xtype:"datefield",name:"BirthDate",anchor:"90%"},{columnWidth:.5,layout:"form",labelWidth:40,//注意,这个参数在这里可以调整简单fieldLabel的布局位置items:[{xtype:"combo",name:"Degree",fieldLabel:"学位",store:["小学","初中","高中","专科","本科","硕士","博士"],emptyText:"请选择适合你的学历",anchor:"90%"}]}]},{ //上面是第二行xtype:"panel",layout:"column",isFormField:true,fieldLabel:"使用框架",items:[{columnWidth:.2,xtype:"checkbox",boxLabel:"",name:"SpringNet",inputValue:"spring"//这里如果用value,值是on,所以用inputValue },{columnWidth:.2,layout:"form",labelWidth:1,items:[{xtype:"checkbox",boxLabel:"Nhibernate",labelSeparator:"",name:"NHibernate",inputValue:"nhibernate",anchor:"95%"}]},{columnWidth:.6,layout:"form",labelWidth:1,items:[{xtype:"checkbox",boxLabel:"Linq",labelSeparator:"",name:"Linq",inputValue:"linq",anchor:"95%"}]}]},{ //上面是第三行xtype:"textfield",fieldLabel:"Email",name:"Email",vtype:"email",//email验证,如果想自定义验证的话,请参见前面的文章vtypeText:"email格式错误!",anchor:"56%"//控制文本框的长度},{ //上面是第四行xtype:"textarea",fieldLabel:"个性签名",name:"OneWord",height:50,anchor:"95%"},{ //上面是第五行xtype:"htmleditor",fieldLabel:"想说的话",name:"WantToSay",anchor:"95%",enableAlignments:false,//去除左右对齐工具栏enableLists:false//去除列表工具栏}],buttons:[{text:"确定",handler:login,formBind:true},{text:"取消",handler:reset}]});function login(){form.form.submit();}function reset(){form.form.reset();}});ExtJs2.0学习系列(9)--Ext.TabPanel之第一式照旧,看个最简单的先,后面再详细说复杂的!效果图片:js代码:html代码:在这里例举几个参数:●tabPosition:"bottom"//选项卡的位置,枚举值bottom,top.默认为top(只有top的时候才能选项卡的滚动!)●tabTip:"提示"//必须先调用Ext.QuickTips.init();才有效果经常我们有这么个情况,一个选项卡加载一个页面,这里我提供一种不是很好但是很稳定的简单方法(已经在项目中验证没有出现问题).就是:使用iframe作为tab的标签页内容.1.用iframe加载其他完整页面的tabpanel.效果图:点击链接"换成博客园",html代码:js代码:今天的内容简单.就暂且说做到了这里,下篇中我们说说tabpanel的滚动标签和动态添加标签的tabpanel!ExtJs2.0学习系列(10)--Ext.TabPanel之第二式2.动态添加tabpanel的标签页效果图:点击"添加新标签页",会添加一个标签页,而且激活这个新的标签页.html代码:js代码:Ext.onReady(function(){Ext.QuickTips.init();var tabsDemo=new Ext.TabPanel({renderTo:Ext.getBody(),activeTab:0,height:700,frame:true,items:[{title:"autoLoad为html简单页面演示",autoLoad:{url:"tab1.htm",scripts:true}}]});//下面是添加新标签页的关键代码,很简单方便var index=0;Ext.get("AddNewTab").on("click",function(){tabsDemo.add({title:"newtab",id:"newtab"+index,html:"new tab",closable:true});tabsDemo.setActiveTab("newtab"+index);index++;})});简单说明:其实添加的话,只要add()方法就可以了,但是我们还要激活这个新的标签页,就必须setActiveTab(newtab的索引或id),关键就是我们不好判断这个索引,所以只好设置个递增的全局变量index来给newtab取名,这样我们也就能准确的获取新的不重复的newtab了,也就容易激活了.而且我们可以通过下图看出来.3.稍微修改上面的例子tabpanel(官方的例子)效果图:我就不多说了,关键的几个参数注释了下js代码:4.为tabpanel标签页添加右键菜单效果图:点击"关闭其他所有页"后,其他两个右键菜单还是道理相同.a)enableTabScroll:true//前面已经说过了b)listeners:{"contextmenu":function(参数1,参数2,参数3){.}}//右键菜单事件,三个参数分别为当前tabpanel,当前标签页panle,时间对象ec)扩充2,每个标签页都有激活和去激活事件activate和deactivate,他们的执行函数有个参数,就是当前标签页.menu=new Ext.menu.Menu()//menu组件,就不多说了,后面会专门分析下,不过不要忘记menu.showAt(e.getPoint());了html代码和上面的例子的html代码一样.js代码:Ext.onReady(function(){Ext.QuickTips.init();var tabsDemo=new Ext.TabPanel({renderTo:Ext.getBody(),//resizeTabs:true,宽度能自动变化,但是影响标题的显示activeTab:0,height:200,enableTabScroll:true,//挤的时候能够滚动收缩width:400,frame:true, //下面是比上面例子新增的关键右键菜单代码listeners:{//传进去的三个参数分别为:这个tabpanel(tabsDemo),当前标签页,事件对象e"contextmenu":function(tdemo,myitem,e){menu=new Ext.menu.Menu([{text:"关闭当前页",handler:function(){tdemo.remove(myitem);}},{text:"关闭其他所有页",handler:function(){//循环遍历tdemo.items.each(function(item){if(item.closable&&item!=myitem){//可以关闭的其他所有标签页全部关掉tdemo.remove(item);}});}},{text:"新建标签页",handler:addTab}]);//显示在当前位置menu.showAt(e.getPoint());}},items:[{title:"tab advantage",html:"sample1"}]});var index=0;function addTab(){tabsDemo.add({title:"ntab"+index,id:"newtab"+index,html:"new tab"+index,closable:true});tabsDemo.setActiveTab("newtab"+index);index++;}new Ext.Button({text:"添加新标签页",handler:addTab}).render(document.body,"AddBtn");});ExtJs2.0学习系列(11)--Ext.XTemplateXTemplate是Extjs里面的模板组件.下面我们看个最简单的例子.效果图:js代码:Ext.onReady(function(){//数据源var data={name:"博客园",read:[{book:'<<道不远人>>',date:'2007-7-7'},{book:"<<大话设计模式>>",date:"2006-6-6"}]}//呈现组件var mypanel=new Ext.Panel({width:400,id:"mypanel",title:"XtemplateData简单示例",renderTo:Ext.getBody()});//创建模板var tpl=new Ext.XTemplate('<table><tr><th>名称:{name}</th></tr>','<tr><td>','<tpl for="read">','<p>编号:{#},书:{book},日期:{date}</p>','</tpl></td></tr></table>');//重写绑定模板tpl.overwrite(mypanel.body,data);});a)pile();//可以在创建模板后,添加pile();编译代码,速度快点.b)tpl.overwrite(mypanel.body,data);//把数据填充到模板中去,并呈现到目标组件c)名称:{name}//对于一维单数据对象,直接用{名称}输出,d)<tpl for="read">//对于多维对象(如拥有多条数据的表),使用tpl和for配合使用,会使用tpl的格式把数据一条一条输出,read为上级节点e){.}//对于一维对数据的对象,如color: ['Red', 'Blue', 'Black'],可以用{.}按照tpl模板逐一输出,如:。
EXT JS (版本3.2.0)Web-address: /1.ExtJS简介ExtJs:是一个用JavaScript编写的Ajax框架,可以开发华丽的富客户端应用。
ExtJs最开始基于YUI技术ExtJs由一系列的类库组成,一旦页面成功加载了ExtJs库后,我们就可以在页面中通过JavaScript 调用ExtJs的类及控件来实现需要的功能2.开始ExtJSExtJs包解压后的部分文件夹解释:adapter: 负责将里面提供的第三方底层库(包括Ext自带的底层库)映射为Ext所支持的底层库docs: API帮助文档examples:提供使用ExtJs做出的小实例resources: ExtUI资源文件目录,如css,图片都放在这里source:无压缩Ext全部的源码(里面分类存放)ext-all.js:压缩后的ext全部源码ext-all-debug.js:无压缩的ext全部源码(用于调试)ExtJs配置:<head></head>:在head标签里加入下面三个引用1.<link rel="stylesheet" type="text/css" href="../res/css/ext-all.css" />2.<link rel="stylesheet" type="text/css" href="../res/css/xtheme-blue.css"/>3.<script type="text/javascript" src="../adapter/ext/ext-base.js"></script>4.<script type="text/javascript" src="../ext-all.js"></script>(工程的目录设置也是有要求的,其中要导入extjs的图片文件,该文件夹在ext-3.0.0\resources路径下,复制images文件夹,原封不动的拷贝到工程中,这时要注意了,ext-all.css和xtheme-blue.css样式的css文件必须放在images目录下。
Ext JS 4类系统在历史上第一次,Ext JS的经历了一个在基础上的巨大重构,这就是新的类系统。
新架构的基础几乎每一个都是建立在Ext JS4.x写单个类上,因此在开始编码之前理解这个类系统是很重要的。
本手册适用于任何希望创造新的或扩大在现有的Ext JS 4.x类的开发者。
它分为4个部分:∙第一节:“概述”解释为什么需要一个强大的类系统∙第二节:“命名约定”讨论命名类,方法,属性,变量和文件的最佳做法。
∙第三节:“实践”提供了详细的一步一步的代码示例∙第四节:“错误的处理和调试”提供有用的提示和技巧,如何处理异常1概述Ext JS4有300多个类。
我们有超过20万开发者的巨大社区,他们来自世界各地,有各种编程背景。
在这种规模的框架中,我们面对的一个巨大挑战就是提供一个共同的代码架构。
这个架构要求:∙熟悉和简单易学∙能快速开发,调试方便,无痛部署∙精心组织,可扩展性和可维护性JavaScript是一个没有类的,原型为导向(prototype-oriented)的语言。
因此,JavaScript语言本质上最强大的功能之一是灵活性。
它可以使用许多不同的编码风格和技巧,以许多不同的方式做同样的工作。
然而,该功能也是不可预知的成本。
如果没有一个统一的结构,JavaScript代码会真的很难理解,维护和再利用。
另一方面,基于类(Class-based)编程,仍然停留OOP的最流行的模式。
基于类的语言,通常需要强类型,提供封装,标准的编码约定。
通常使得开发者坚持一个大原则,编写的代码更可能是可预见的、可延伸和可扩展的。
然而,他们却不具有JavaScript这样的语言的动态能力。
每种方法都有其自身的利弊,我们能否对各方都去其糟粕,取其精华?答案是肯定的,我们已经在Ext JS 4的解决方案中实现了。
2命名约定使用一致的命名约定作为所有类的代码基础,而命名空间和文件名有助于保持你的代码的组织,结构化和可读性。
ExtJS表格——⾏号、复选框、选择模型本篇的内容是为表格添加⾏号,和复选框,最后谈⼀下Ext的选择模型。
内容⽐较简单,就直接上代码了。
⼀、设置⾏号⾏号的设置主要问题在于删除某⼀⾏后需要重新计算⾏号Ext.onReady(function() {var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), --在这⾥设置⾏号{ header: '编号', dataIndex: 'id' },{ header: '性别', dataIndex: 'sex' },{ header: '名称', dataIndex: 'name' },{ header: '描述', dataIndex: 'descn' }]);var data = [['1', 'male', 'name1', 'descn1'],['2', 'female', 'name2', 'descn2'],['3', 'male', 'name3', 'descn3'],['4', 'female', 'name4', 'descn4'],['5', 'male', 'name5', 'descn5']];var store = new Ext.data.Store({proxy: new Ext.data.MemoryProxy(data),reader: new Ext.data.ArrayReader({}, [{ name: 'id' },{ name: 'sex' },{ name: 'name' },{ name: 'descn' }])});store.load();var grid = new Ext.grid.GridPanel({autoHeight: true,renderTo: 'grid',store: store,cm: cm});Ext.get('remove').on('click', function() { --监听删除按钮的单击事件store.remove(store.getAt(1)); --store.getAt(1) 获得第2⾏数据grid.view.refresh(); --强制grid刷新,重新计算⾏号});});页⾯代码:<body><div id="grid"></div><input id="remove" type="button" value="删除第⼆⾏数据" /></body>⼆、设置复选框复选框是通过Ext.grid.CheckboxSelectionModel来设置的,它会在每⾏数据前加⼀个复选框,另外它必须添加到列定义和表格装配定义2个部分。
ExtJS4出提示的步骤1.第一步:准备文件1 准备好spket-1.6.23(或者更高版本)。
2 准备好关联的提示文件,一般是ExJS4.x中的ext-all-dev.js文件。
2.第二步:将文件放到指定位置将准备好的spket-1.6.23(或者更高版本,解压后的文件。
不是.jar文件)文件复制到MyEclipse的安装目录MyEclipse\MyEclipse 10\dropins文件夹中。
然后重启。
3.第三步:检查是否安装成功打开MyEclipse,点击Window标签下的Preferences查看是否有Spket选项。
如图所示如果有表示安装成功。
4.第四步:关联文件出提示重启MyEclipse后,点击Window-Preference-Spket-Javascript Profiles点击New,弹出一个框,输入新的profile的名字。
(重要:把它设置成default)接下来点击你新建的profile 点击Add Library 在下拉框中选择ExtJs 表示这个profile 是ExtJs的profile然后还是点击刚才的profile 点击profile下新增的ExtJs 点击右侧的Add File ,把我们在上面准备好关联的提示文件,一般是ExJS4.x中的ext-all-dev.js文件,选择它与之关联。
完成后如下图所示:5.第五步:文件的打开方式以上完成了所有的文件配置后,就能出提示了,但是要注意,当我们打开自己建的JS文件的时候,不能用MyEclipse默认的打开方式,要用如下截图中的打开方式才能显示提示:6.怎样设置JS文件的默认打开方式Window-Preferences-General-Editors-File Associations这里是指定在eclipse里哪类文件用哪个插件编辑在右上方选择*.js 在右下方选择Spket Javascript Editor 点击右边的Default 表明在eclipse里用Spket的js编辑器默认编辑js文件到此大功告成!!!!!!!!!!!!!!!!11。
ExtJs的简称,是一个强大的js类库 ext是一个强大的js类库,以前是基于YAHOO-UI,现在已经完全独立了, 主要包括data,widget,form,grid,dd,menu,其中最强大的应该算grid了,编程思想是基于面向对象编程(oop),扩展性相当的好.可以自己写扩展.自己定义命名空间.web应用可能感觉太大.不过您可以根据需要按需加载您想要的类库就可以了. 主要包括三个大的文件ext-all.css,ext-base.js,ext-all.js(包括所有的类库,您可以根据需要进行删减.官方网站提供这一接口),在引用ext类库的时候.这三个文件必不可少. 它提供了丰富的,非常漂亮的外观体验,成为众多界面层开发人员的追捧!其核心的组件基本覆盖了我们构建富客户端的常用的组件。 从 Ext 2开始,商业版(针对那些以盈利为目的的开发方)要收费了。这可能会影响一些他的应用前景。 目前的最新版本为3.2.1,该版本是在2010年4月27日发布的。
Extjs介绍 序言: 2.1. 功能丰富,无人能出其右 无论是界面之美,还是功能之强,ext的表格控件都高居榜首。 单选行,多选行,高亮显示选中的行,推拽改变列宽度,按列排序,这些基本功能咱们就不提了。 自动生成行号,支持checkbox全选,动态选择显示哪些列,支持本地以及远程分页,可以对单元格按照自己的想法进行渲染,这些也算可以想到的功能。 再加上可编辑grid,添加新行,删除一或多行,提示脏数据,推拽改变grid大小,grid之间推拽一或多行,甚至可以在tree和grid之间进行拖拽,啊,这些功能实在太神奇了。更令人惊叹的是,这些功能竟然都在ext表格控件里实现了。
呵呵~不过ext也不是万能的,与fins的ecside比较,ext不能锁定列(土豆说1.x里支持锁定列,但是2.0里没有了,因为影响效率。),也没有默认的统计功能,也不支持excel,pdf等导出数据。另外fins说,通过测试ecside的效率明显优于ext呢。:)
Ext发展史: 1、第一只“出海”的YUI-Ext只是作者Jack打算对基于BSD协议的Yahoo!UI库进行自定义的扩展,但后来一度风头盖过其父辈YUI,足以说明 大家对它的热情,很多人把它投入项目人并不十分了解它。分析人士打了一比喻:就好比尚未谋面, 并不了解一个人的家庭、教育、品行等背景,只因为他有一副精致漂亮的外观,就对其陷入了疯狂的倾慕之中。因此分析人士建议,在投入项目前,要认真仔细地了 解EXT的内在原理和与其他Ajax库不同地方。 2、在2006年初 ,Jack Slocum(杰克斯·洛克姆 ) 就一套公用设施扩建为Yahoo! User Interface (YUI) 库而工作。这些扩展很快组织成一个独立的库代码并以” yui-ext” 的名义下发布。 3、在2006年秋天,Jack发行了版本为0.33的yui-ext,而最终被证明为最后版本的代码,根据这名字(下开放源代码DSB许可)。在年底之前,这个库已大受欢迎, 名字被简化为Ext,反映了它作为一个框架的成熟和独立。 该公司成立于2007年初,Ext现在为双执照,使用LGPL和一个商业执照。 4、在2007年4月1日,发布1.0正式版。 5、直至今日(2008年4月1日)ExtJS已发展涵盖美国、日本、中国、法国、德国等全球范围的用户,现在的版本为Ext-3.0
6、官方在2009年4月14-16日的首次Ext Conference中发布了Ext的3.0 RC版本。
什么是Ext: 1、ExtJS可以用来开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。ExtJs最开始基于YUI技术,由开发人员JackSlocum开发,通过参考JavaSwing等机制来组织可视化组件,无论从UI界面上CSS样式的应用,到数据解析上的异常处理,都可算是一款不可多得的JavaScript客户端技术的精品。
2、Ext的UI组件模型和开发理念脱胎、成型于Yahoo组件库YUI和Java平台上Swing两者,并为开发者屏蔽了大量跨浏览器方面的处理。相对来说,EXT要比开发者直接针对DOM、W3C对象模型开发UI组件轻松。
ExtJs UI Engine简介: ExtJs初期仅是对Yahoo! UI的对话框扩展,后来逐渐有了自己的特色,深受网友的喜爱。 发展至今, Ext除YUI外还支持Jquery、Prototype等的多种JS底层库,让大家自由地选择。该框架完全基于纯Html/CSS+JS技术,提供丰富的跨浏览器UI组件,灵活采用JSON/XML数据源开发,使得服务端表示层的负荷真正减轻,从而达到客户端的MVC应用!
ExtJs支持多平台下的主流浏览器 Internet Explorer 6+ FireFox 1.5+ (PC, Mac) Safari2+、Opera9+。在使用的厂家包括IBM、Adobe、Cisco和更多。ExtJs官方网站www.extjs.com
Ajax主流框架与ExtJS JQuery、 Prototype和YUI都属于非常核心的JS库。虽然YUI,还有最近的JQuery,都给自己构建了一系列的UI器件(Widget),不过却没有一个真正的整合好的和完整的程序开发平台。哪怕是这些低层的核心库已经非常不错了,但当投入到真正的开发环境中,依然需要开发者做大量的工作去完善很多缺失之处。而Ext就是要填补这些缺口。主流开源框架中只有Dojo像Ext一样,尝试着提供整合的开发平台。相比Dojo这个出色的工具包,我们认为 Ext能提供一个粘合度更高的应用程序框架。Ext的各个组件在设计之时就要求和其它Ext组件组合一起工作是无缝合作的。这种流畅的互通性,离不开一个紧密合作的团队,还必须时刻强调设计和开发这两方面目标上的统一,而这点是很多开源项目未能做到的。从构建每一个组件开始,我们始终都强调组件的外观、性能、互通性和可扩展性,而我们认为组件已经达到了这几点的要求。 Ext绝对可以单独使用。实际上,除了有特定的要求,推荐单独使用Ext,这样的话文件占位更小,支持和整合也更紧密。我们也支持与jQuery、 YUI或Prototype整合使用,作为低层库的角色出现,以提供处理各种核心的服务,如DOM和事件处理,Ajax连接和动画特效。使用整合方式的一个原因是它们已具备了一些特定的器件而Ext并没有原生支持——像YUI的History控件便是一个典型的例子。这时,Ext需要依赖YUI这个库的底层来实现History控件,这样一来的话也可免去Ext自身底层库,从而减少了整个程序的内存占用。另一个使用整合方式的原因是,对于许多已在使用其他底层库的程序,你可能希望逐步加入Ext。总之,如果已经有了其他库,Ext可已利用它们。我们的宗旨是为用户提供各种可能性和性能上的优化。而事实是,只要实现了相对应的底层库接口,为任意一个框架添加上适配器是没有问题的——人们可以轻松地将Dojo、Moo、Ajax.NET,或其它JS库转变为 Ext的底层。
Ext从2.x开始收费,这给他的应用前景带来一些问题。不过对国内开发人员的影响不大,毕竟是客户付款。
Ext学习及应用经验小结 一、理解Html DOM、Ext Element及Component 要学习及应用好Ext框架,需要理解Html DOM、Ext Element及Component三者的区别。 Ext是基于Web的富客户端框架,其完全是基于标准W3C技术构建设的,使用到的都是HTML、CSS、DIV等相关技术。Ext最杰出之处,是开发了一系列非常简单易用的控件及组件,我们只需要使用这些组件就能实现各种丰富多彩的UI的开发。
无论组件有多少配置属性、还是事件、方法等等,其最终都会转化为HTML在浏览器上显示出来,而每一个HTML页面都有一个层次分明的DOM树模型,浏览器中的所有内容都有相应的DOM对象,动态改变页面的内容,正是通过使用脚本语言来操作DOM对象实现。
仅仅有DOM是不够的,比如要把页面中的某一个节点移到其它位置,要给某一个节点添加阴影效果,要隐藏或显示某一个节点等,我们都需要通过几句 javascript才能完成。因此,Ext在DOM的基础上,创建了Ext Element,可以使用Element来包装任何DOM,Element对象中添加了一系列快捷、简便的实用方法。
对于终端用户来说,仅仅有Element是不够的,比如用户要显示一个表格、要显示一棵树、要显示一个弹出窗口等。因此,除了Element以外,Ext 还建立了一系列的客户端界面组件Component,我们在编程时,只要使用这些组件Componet即可实现相关数据展示及交互等,而 Component是较高层次的抽象,每一个组件在渲染render的时候,都会依次通过Element、DOM来生成最终的页面效果。 在使用Ext开发的应用程序中,组件Component是最高层次的抽象,是直接给用户使用的,Ext Element是Ext的底层API,主要是由Ext或自定义组件调用的,而DOM是W3C标准定义的原始API,Ext的Element通过操作DOM 来实现页面的效果显示。
在Ext中,组件渲染以后可以通过访问组件的el属性来得到组件对应的Element,通过访问Element的dom属性可以得到其下面的DOM对象。另外,我们可以通过通过Ext类的快捷方法getCmp、get、getDom等方法来得组件Component、Ext元素Element及DOM节点。比如:
var view=new Ext.Viewport();//创建了一个组件Component view.el.setOpacity(.5);//调用Element的setOpacity方法 view.el.dom.innerHTML="Hello Ext";//通过Element的dom属性操作DOM对象 再看下面的代码: var win=new Ext.Window({id:"win1",title:"我的窗口",width:200,height:200}); win.show(); var c=Ext.getCmp("win1");//得到组件win var e=Ext.get("win1");//根据id得到组件win相应的Element var dom=Ext.getDom("win1");//得到id为win1的DOM节点 二、熟悉ext组件体系 Ext2.0对整个框架进行了重构,最为杰出的是推出了一个以Component类为基础的组件体系,在Component类基础上,使用面向对象的方法,设计了一系列的组件及控件。因此,要能游刃有余地使用Ext,熟悉Ext组件体系是最基本的。