Extjs4 API文档阅读
ExtJS 4 官方指南:数据 Data 简体中文版

ExtJS 4 官方指南翻译:数据Data 数据包加载并保存您的应用程序中的所有数据。
它包括41类,但其中有三个,比其他的都, Store和有些支持的卫星类:1模型和存储Models and Stores让我们看看怎么创建一个Model:Ext.define('User',{extend:'Ext.data.Model',fields:[{ name:'id', type:'int'},{ name:'name', type:'string'}]});Models通常会用到Store,Store基本上是Models实例的一个集合。
建立一个Store和加载其数据很简单:Models are typically used with a Store, which is basically a collection of Model instances. Setting up a Store and loading its data is simple:Ext.create('Ext.data.Store',{model:'User',proxy:{type:'ajax',url :'users.json',reader:'json'},autoLoad:true});我们配置Store使用Ajax Proxy,告诉它加载数据的URL,并用一个Reader解析数据。
在这种情况下,我们的服务器返回JSON,所以我们创建一个JSON Reader来读取响应。
Store 从URL users.json中自动加载User model实例集合。
users.json URL应该返回一个JSON 字符串,看起来像这样:We configured our Store to use an Ajax Proxy, telling it the url to load data from andthe Reader used to decode the data. In this case our server is returning JSON, so we've set up a Json Reader to read the response. The store auto-loads a set of User model instances from the url users.json. The users.json url should return a JSON string that looks something like this:{success:true,users:[{ id:1, name:'Ed'},{ id:2, name:'Tommy'}]}Simple Store例子里有现场演示。
ext4说明帮助文档大全

ext4说明帮助⽂档⼤全Extjs ⽂件上传的实现⽅法发布时间:2011-03-22 来源:互联⽹作者:佚名点击:364上传⽂件要是⽤/doc/723208247.html的控件上传其实是很简单的问题,要是为了⽤户体验的提⾼很多的web开发⼈员都会采取很炫的ajax上传。
⼀般情况都使⽤flash的控件上传。
本⽂介绍使⽤EXTJS 实现⽂件的上传。
Extjs 要实现上传,需要⼀个js⽂件FileUploadField.js,在extjs类库⽂件⾥可以找到。
当然也可以使⽤Ext.ux.UploadDialog.Dialog这个插件来实现上传。
FileUploadField.js代码:1./*!2. * Ext JS Library3.2.03. * Copyright(c) 2006-2010 Ext JS, Inc.4. * licensing@/doc/723208247.html5. * /doc/723208247.html/license6. */7.Ext.ns('Ext.ux.form');8.9./**10. * @class Ext.ux.form.FileUploadField11. * @extends Ext.form.TextField12. * Creates a file upload field.13. * @xtype fileuploadfield14. */15.Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, {16./**17. * @cfg {String} buttonText The button text to display on the upload button (defaults to18. * 'Browse...'). Note that if you supply a value for {@link #buttonCfg}, the buttonCfg.text19. * value will be used instead if available.20. */21. buttonText: 'Browse...',22./**23. * @cfg {Boolean} buttonOnly True to display the file upload field as a button with no visible24. * text field (defaults to false). If true, all inherited TextField members will still be available.25. */26. buttonOnly: false,27./**28. * @cfg {Number} buttonOffset The number of pixels of space rese rved between the button and the text field29. * (defaults to 3). Note that this only applies if {@link #butt onOnly} = false.30. */31. buttonOffset: 3,32./**33. * @cfg {Object} buttonCfg A standard {@link Ext.Button} config object.34. */35.36.// private37. readOnly: true,38.39./**40. * @hide41. * @method autoSize42. */43. autoSize: Ext.emptyFn,44.45.// private46. initComponent: function(){47. Ext.ux.form.FileUploadField.superclass.initComponent.call(th is);48.49.this.addEvents(50./**51. * @event fileselected52. * Fires when the underlying file input field's value has changed from the user53. * selecting a new file from the system file selection d ialog.54. * @param {Ext.ux.form.FileUploadField} this55. * @param {String} value The file value returned by the underlying file input field56. */57.'fileselected'58. );59. },60.61.// private62. onRender : function(ct, position){63. Ext.ux.form.FileUploadField.superclass.onRender.call(this, c t, position);64.65.this.wrap = this.el.wrap({cls:'x-form-field-wrap x-form-file-wrap'});66.this.el.addClass('x-form-file-text');67.this.el.dom.removeAttribute('name');68.this.createFileInput();69.70.var btnCfg = Ext.applyIf(this.buttonCfg || {}, {71. text: this.buttonText72. });73.this.button = new Ext.Button(Ext.apply(btnCfg, {74. renderTo: this.wrap,75. cls: 'x-form-file-btn' + (btnCfg.iconCls ? ' x-btn-icon': '')76. }));77.78.if(this.buttonOnly){79.this.el.hide();80.this.wrap.setWidth(this.button.getEl().getWidth());81. }82.83.this.bindListeners();84.this.resizeEl = this.positionEl = this.wrap;85. },86.87. bindListeners: function(){88.this.fileInput.on({89. scope: this,90. mouseenter: function() {91.this.button.addClass(['x-btn-over','x-btn-focus'])92. },93. mouseleave: function(){94.this.button.removeClass(['x-btn-over','x-btn-focus','x-btn-click'])95. },96. mousedown: function(){97.this.button.addClass('x-btn-click')98. },99. mouseup: function(){100.this.button.removeClass(['x-btn-over','x-btn-focus' ,'x-btn-click']) 101. },102. change: function(){103.var v = this.fileInput.dom.value;104.this.setValue(v);105.this.fireEvent('fileselected', this, v);106. }107. });108. },109.110. createFileInput : function() {111.this.fileInput = this.wrap.createChild({112. id: this.getFileInputId(),113. name: /doc/723208247.html||this.getId(),114. cls: 'x-form-file',115. tag: 'input',116. type: 'file',117. size: 1118. });119. },120.121. reset : function(){122.this.fileInput.remove();123.this.createFileInput();124.this.bindListeners();125. Ext.ux.form.FileUploadField.superclass.reset.call(this); 126. },127.128.// private129. getFileInputId: function(){130.return this.id + '-file';131. },132.133.// private134. onResize : function(w, h){135. Ext.ux.form.FileUploadField.superclass.onResize.call(this, w, h);136.137.this.wrap.setWidth(w);138.139.if(!this.buttonOnly){140.var w = this.wrap.getWidth() - this.button.getEl().getW idth() - this.buttonOffset; 141.this.el.setWidth(w);142. }143. },144.145.// private146. onDestroy: function(){147. Ext.ux.form.FileUploadField.superclass.onDestroy.call(this) ;148. Ext.destroy(this.fileInput, this.button, this.wrap);149. },150.151. onDisable: function(){152. Ext.ux.form.FileUploadField.superclass.onDisable.call(this) ;153.this.doDisable(true);154. },155.156. onEnable: function(){157. Ext.ux.form.FileUploadField.superclass.onEnable.call(this); 158.this.doDisable(false); 159.160. },161.162.// private163. doDisable: function(disabled){164.this.fileInput.dom.disabled = disabled;165.this.button.setDisabled(disabled);166. },167.168.169.// private170. preFocus : Ext.emptyFn,171.172.// private173. alignErrorIcon : function(){174.this.errorIcon.alignTo(this.wrap, 'tl-tr', [2, 0]);175. }176.177.});178.179.Ext.reg('fileuploadfield', Ext.ux.form.FileUploadField);180.181.// backwards compat182.Ext.form.FileUploadField = Ext.ux.form.FileUploadField;HTML代码:1.:///doc/723208247.html/TR/xhtml1/DTD/xhtml1-transitional.dtd">2.3.4. 5. 6. 7. 8. 9.10.38.39. 108.。
{选篇}extjs中文API ln

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布局中,子元素将自动填满整个父容器。
ExtJS4应用架构设计简体中文版

Extjs4 应用架构设计应用的可扩展性、可维护性和灵活性取决于应用架构的质量。
不幸的是,这往往被视为马后炮。
概念设计和原型变成了大规模的应用,许多应用的基础基本就是示例代码的复制与粘贴,这很诱人,因为这可以让你在项目在开始阶段有一个快速的进度。
然而,节省下来的时间相对于项目后期的维护、扩展甚至重构应用的时间来说,算不得什么。
比较好的的方式是写一个可靠的架构,在实施前编写好遵循的约定和定义应用的视图、模型、存储和控制器等。
在这篇文章,我们将会看到一个受欢迎的应用并讨论如何构建用户接口,从而创建可靠的架构。
1 代码结构应用程序架构体系会为实际类和框架代码提供结构和一致性。
建立一个好的架构有以下主要好处:■ 每个应用的工作方式是相同的,因而你只需要学习一次。
■ 在应用之间很容易分享代码,因为工作方式是相同的。
■ 你可以使用ExtJS的生成工具为你的应用程序创建经过优化的发布版本。
在ExtJS 4创建你的应用时,应该考虑一下我们定义的约定,尤其是统一的目录结构。
这个结构要求所有类文件都放到app目录下,在该目录下,可根据命名空间建立model、view、controller和store等4个子目录。
虽然ExtJS 4提供了如何构建你的应用的最佳做法,但是你也可以根据自己需要修改我们建议的文件和类的命名约定,例如,你可以为你的控制器在“Controller” 前加上前缀,如“Users”修改为“UsersController”。
在这种情形下,记得给所有的控制器文件和类加前缀。
最重要的一点是,要在开始编写应用程序前定义好这些约定并遵守它。
这样,你就可以在任何需要的地方调用这些类。
我们强烈建议要遵model、view、controller和store这4个文件夹的命名约定,这可以确保你可以使用SDK Tools beta对应用进行优化。
2 寻找平衡点2.1 视图View将应用程序的UI分割成视图是好的开始。
ExtJS 4 官方指南翻译:Tree组件

1.Ext.create('Ext.tree.Panel', {2. renderTo: Ext.getBody(),3. title: 'Simple Tree',4. width: 150,5. height: 150,6. root: {7. text: 'Root',8. expanded: true,9. children: [10. {11. text: 'Child 1',12. leaf: true13. },14. {15. text: 'Child 2',16. leaf: true17. },18. {19. text: 'Child 3',20. expanded: true,21. children: [22. {23. text: 'Grandchild',24. leaf: true25. }26. ]27. }28. ]29. }30.});此树面板渲染到document.body元素上。
我们把定义的根节点(The Root Node)自动扩张开来,这是默认的情况。
根节点有三个子节点,其中前两个是leaf 节点,表示他们下面没有任何子节点(children)了(终结了)。
第三个节点是一个叶子节点,已经有一个child 的叶节点(one child leaf node)。
text 属性是节点的显示的文本。
可打开例子看看效果如何。
This Tree Panel renders itself to the document body. We defined a root node that is expanded by default. The root node has three children, the first two of which are leaf nodes which means they cannot have any children. The third node is not a leaf node and has has one child leaf node. The text property is used as the node's text label.See Simple Tree for a live demo.树面板的数据存储在TreeStore。
ExtJS 4 官方指南翻译:Drag and Drop 拖放 简体中文版

ExtJS 4 官方指南翻译:Drag and Drop 拖放分类:ExtJS 4.02011-10-26 17:03 454人阅读评论(0) 收藏举报原文:/ext-js/4-0/#!/guide/drag_and_drop翻译:frank/sp42 转载请保留本页信息1 拖放Drag and Drop在那么多的交互设计模式之中,“拖放(Drag andDrop)”模式可以说是开发者感觉比较不错的。
用户日常在进行拖放操作的时候,真的是连“想都不用想”地就可以进行拖放操作了,非常直观而且易学易用。
下文中的教程中,请跟随我们。
不是我们“大厥其词”,而是真的——只要将下面五个步骤的要义领会在心,拖放的话将不再是一件难事。
One of the most powerful interaction design patterns available to developers is "Drag and Drop." We utilize Drag and Drop without really giving it much thought - especially when its done right. Here are 5 easy steps to ensure an elegant implementation.2 拖放的定义Defining drag and drop拖动(drag)动作的发生,就是鼠标在某些UI 元素身上点击了,然后按着不放鼠标,进行鼠标移动的动作;放下(drop,或者称“置下”)动作的发生,就是拖动开始后,鼠标按钮松开了——也就是放下的动作。
宏观而言,拖放两者的操作可用下面的流程图来描述。
A drag operation, essentially, is a click gesture on some UI element while the mouse button is held down and the mouse is moved. A drop operation occurs when the mouse button is released after a drag operation. From a high level, drag and drop decisions can be summed up by the following flow chart.ExtJS本身就提供了Ext.dd以实现拖放的支持。
Extjs4分享手册
Extjs布局
Extjs布局分为容器布局和组件布局两大类。 容器布局:
组件布局:Dock、Tool、Field、TriggerField
容器布局
一、Auto layout 说明:组件在容器中原样排列
二、Anchor layout 说明:组件通过anchor属性,out 说明:继承自Anchor布局,可以同通过x、y 属性设置组件同容器左上角的距离。
如下页面:
获取id为text1的html控件:Ext.getDom(“text1”) 获取第一个input控件:Ext.query("input")[0] 获取id为text2的ext元素:Ext.get(“text2”) 获取id为textfield1的ext元素:Ext.get("textfield1") 获取id为textfield2的ext组件:Ext.getCmp(“textfield2”) 获取第一个textfield组件:ponentQuery.query(“textfield”)*0+ 获取textfiled1相邻的textfield2:Ext.getCmp("textfield1").next("textfield") 获取textfieldchild1的父panel:Ext.getCmp(“textfieldchild1”).up(“panel”) 获取panel下面的第一个textfield组件: ponentQuery.query("panel[title=Extjs控件]")[0].down("textfield")
Chapter:
Ext.define ('Chapter', { extend: 'Ext.data.Model', fields: [ {name: 'id', type: 'int'}, {name: 'number', type: 'int'}, {name: 'title', type: 'string'}, {name: 'bookId', type: 'int'} ] }); 说明:hasMany有以下的配置项 model :关联对象的model名称 name::关联的模型别名,用来获取关联对象数据,如果没有,默认为model名称加上“s” primaryKey :主键,主对象用于关联的属性名称,默认为id foreignKey:外键,关联对象用于关联的属性名称,默认为关联对象model名称加上“_id” filterProperty :过滤数据,只需要指定数据关联
看ExtJs API文档的阅读方法
看ExtJs API文档的阅读方法对EXT,下载一个ext2.0的API文件,叫你如何看懂API,看完保证就会用API,但是你必须看完。
Config OptionsPublic PropertiesPublic MethodsPublic Events基本上都由以上4部分组成Config Options下的内容为你在实例化一个对象时进行配置,也就是比如new Panel({a:"xxx",b:"yyy"}),这里的a和b就是来自于Config Options就拿tree下的TreeNode来说:Config Options下的checkedchecked : BooleanTrue to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no...True to render a checked checkbox for this node, false to render an unchecked checkbox (defaults to undefined with no checkbox rendered)TreeNode是树节点的意思,那么肯定也就是一个节点而checked很明显我们就能猜出来是是否选中的意思这个checked是在Confgi Options下的,是实例化的时候用的,注意这点,其他时候能否用你是不知道的而且这个配置选项的值必须只接受boolean类型的,也就是true或false比如 var root = new Ext.tree.TreeNode({checked:true});比如href : String 表示的配置选项href接受的类型是string的这个所谓的配置选项,也就是Config Options下的内容,只有你在实例化的时候用的,也就是你在new 类名({...})时用的然后你再看 Public Properties 部分看这个childNodes ,public properties下的childNodes : Array 这样写表示的是你从一个实例化对象里取得的属性,比如你刚才 var tn = newExt.tree.treeNode({....});这样已经实例化了一个对象了,那么现在你可以取实例化对象的数据了,怎么取呢,可以取里面的什么东西呢,那么这里public properties里的列出的就是你能取的,那么你要tn.childNodes就能获得一个Array类型的数据,所以public properties下列出的就是一个实例化对象能取的信息,冒号后面的是你索取得的信息的返回类型.Public Methods 再来看这个部分一般第一个都会是你实例化一个对象的构造方法TreeNode( Object/String attributes )表示的是这个构造方法可以接受两种类型的参数,一个是object类型的,一个是string类型的所谓的object类型的一般是这种模式{...},而所谓的string类型就是"..." 再看appendChild( Node/Array node ) : Node 这个表示的是能接受的参数是Node类型或者Array类型的数据,注意看括号里面的括号里面的才是调用这个方法时需要传递进去的参数类型. 而冒号后面的那个Node的意思是你调用这个方法后返回的一个数据类型.比如var n = tn.appendChild(new Ext.tree.TreeNode({....}));那么是能够得到这个n的值的,并且这个n的值肯定就是Node类型的.接下来看Public Events部分:这部分的内容表示的是你在使用TreeNode类的时候可能出现的事件比如你对一个树节点进行添加子节点的操作,那么append事件就会发生,也就是在你var n = tn.appendChild(new Ext.tree.TreeNode({....}));运行这个代码的时候会发生append事件append : ( Tree tree, Node this, Node node, Number index )冒号后面的表示的是发生这个事件时会传递过来的数据.要记住和理解这点,那么事件是这样发生的,但是你如何捕获事件呢?就是通过两种方式:一种是on,一种是listeners,你可以在实例化一个类的时候为listeners配置选项赋值,比如var tn = newExt.tree.TreeNode({listeners:{"append":function(a,b,c,d){....}}})还有一种是你对这个实例进行on或addListener方法的调用,Public Methods 下面的on或addListener这个不是无缘无故出来的on( String eventName, Function handler, [Object scope], [Object options] ) : void 要知道这个事件捕获接受哪些参数,另外:js跟java是不一样的java的方法你传递的参数个数必须根定义的一样,但是js的并不需要 ,所以你在进行on方法的调用是可以传递不等同个数的参数,那么这里on( String eventName, Function handler, [Object scope], [Object options] ) : void可以只传递2个参数,一般情况下,这个api告诉你的是,[]这样括起来的表示你可以不传递的参数, 其他的最好传递进来所以你可以这样调用了. tn.on("append",function(){...})或者tn.on("append",hello);function hello(a,b,c,d){...}[Object scope], [Object options]这个是作用域一般就是传递this什么的,有时候会用到,特别是当你遇到一些问题时这个on或addListener方法的调用跟public events下的事件是挂钩的事件append : ( Tree tree, Node this, Node node, Number index ) 冒号后面表示的是事件发生时自动得到的信息所以,当在调用on方法时,on方法里handler参数就很关键了.Function handler 这里定义的方法将被调用,别且会将事件append : ( Tree tree, Node this, Node node, Number index ) 冒号后面表示的是事件发生时自动得到的信息的参数传递给它所以你在定义这个handler的时候就可以定义成接受( Tree tree, Node this, Node node, Number index ) 这4个类型的参数tree.on("click",function(node,event) 这里的function(node,event)可以单独拿出来event 就是事件,事件并不是作用在方法上,而是作用在对象上,只是,比如你想右键一个树节点后去调用某个方法在调用某些方法的时候触发了事件的发生:那么,你就可以tn.on("contextmenu",function(node,e){...})Public Events下面的东西只是定义了一些事件,而真正使用事件是你进行捕获,就是用on:另外on是addListener的简写,两个方法是一样的.看API各个配置选项或属性或方法或事件的右边,有个叫Defined By,列头 - Defined By,他表示的是这些信息是由哪个类定义的,因为你要知道ext中一个很重要的信息就是继承,所以有些方法或配置选项或属性都是来自于他的父类或超类,那么这个Defined By 就告诉了你是来自具体的哪个父类或超类这样在你看源码的时候就非常清晰然后Defined By 如果字体是黑色的表示这个配置选项或属性或方法或事件是他本身这个类定义的所以你一般去看一个类的特性的时候,你只需要去关注这个黑色文本的那些配置选项或属性或方法或事件然后我们再看看最上面的部分Class Ext.tree.TreeNodePackage: Ext.treeDefined In: TreeNode.jsClass: TreeNodeSubclasses: AsyncTreeNodeExtends: Node这里有Subclasses和ExtendsSubclasses表示这个类有哪些子类,Extends表示这个类继承自哪个类所以要说这点,是因为要说事件应用的限制只有那些继承了Observable类的类,也就是这个类是Observable的子类或子孙类,那么这个类才拥有事件处理机制,也就是才会有Public Events部分所以,如果自己扩展一个类,想拥有事件处理和响应机制,那么这个类就必须是这个Observable类的子类或子孙类可以一直点Extends后面的进去,最后肯定会出来我说的这个Observable类来源:/haoliansheng/archive/2009/05/15/1457277.html。
extjs-4-components
子组件通过容器的items加入到容器中,下面这个例子通过Ext.create方法创建了两var childPanel1 = Ext.create('Ext.panel.Panel', {title: 'Child Panel 1',html: 'A Panel'});var childPanel2 = Ext.create('Ext.panel.Panel', {title: 'Child Panel 2',html: 'Another Panel'});Ext.create('Ext.container.Viewport', {items: [ childPanel1, childPanel2 ]});容器通过“布局管理器(Layout Manager)”管理子组件的尺寸和位置。
关于布局和容器的详细内容可以查看《ExtJS 4 布局和容器》XTypes and Lazy Instantiation xtype和延迟加载每个组件都有⼀一个代称叫做xtype,例如Ext.panel.Panel的xtype是panel。
所有组件的xtype在API Docs for Component中有列出。
上面那个例子说明了如何添加已经初始化的组件到⼀一个容器中。
在大的应用中,这种方式是不可行的,因为这种方法需要每个组件都是初始化过的,但是大的应用中,由于使用的方式有些组件可能根本没有被用到(比如有100个页面的应用,⼀一个用户登录进来只操作了两个页面,这时把其他98个页面的组件全部初始化是不合理的),例如⼀一个用到TabPanel的应用,TabPanel的每个tab只当用户点击它的时候再渲染即可。
这就是引入xtype机制的原因,有了xtype可以让⼀一个容器的子组件事先定义好,到真正需要的时候再初始化。
ExtJS 4 官方指南翻译:容器与布局(Layouts and Containers)
ExtJS 4 官方指南翻译:容器与布局(Layouts and Containers)分类:ExtJS 4.02011-10-10 15:46 478人阅读评论(0) 收藏举报原文:/ext-js/4-0/#!/guide/layouts_and_containers翻译:frank/sp42 转载请保留本页信息布局系统是Ext JS 的最强大的部分之一。
它可以处理您的应用程序中的每个组件的大小和定位。
本指南介绍了如何进行布局的基础知识。
The layout system is one of the most powerful parts of Ext JS. It handles the sizing and positioning of every Component in your application. This guide covers the basics of how to get started with layouts.1 容器(Containers)Ext JS 程序所谓的UI,是由组件Component 组成的(参见《组件指南》。
容器Container 是一种特殊类型的组件,它可以包含其他组件。
一个典型的Ext JS 的应用程序是由不同的组件嵌套而成。
An Ext JS application UI is made up of Components (See the Components Guide for more on Components. A Container is a special type of Component that can contain other Components. A typical Ext JS application is made up of several layers of nested Components.最常用的容器是面板Panel。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Extjs4 API文档阅读(一)——类系统(Class System)2011-07-02 来源:互联网作者:佚名(共0 条评论)ExtJS4使用新的类机制进行了大量的重构。
为了支撑新的架构,ext4几乎重写了每一个类,因此最好先好好的理解一下新的架构,再开始编码。
ExtJS4使用新的类机制进行了大量的重构。
为了支撑新的架构,ext4几乎重写了每一个类,因此最好先好好的理解一下新的架构,再开始编码。
本文适合想在extjs4中扩展现有类或者创建新类的开发者。
其实,不管是想扩展还是使用,都建议您仔细阅读一下(如果E文好的,建议您还是阅读英文原文。
链接地址是:/ext-js/4-0/#/guide/class_system)。
文章共分4个部分,建议每一部分都仔细研究下,对之后的开发工作,会有意想不到的好处。
第一部分:概述。
说明了强大的类机制的必要性第二部分:编码规范。
讨论类、方法、属性、变量和文件命名第三部分:DIY。
详细的编码示例第四部分:错误处理和调试。
提供一些有用的调试和异常处理技巧一、概述ExtJS4拥有超过300个的类.迄今为止,我们的社区拥有超过20万来自世界各地,使用不同后台语言的开发者.要在这种规模的框架上提供具有以下特点的架构,需要面临巨大的挑战:1、简单易学。
2,快速开发、调试简单、部署容易。
3,良好的结构、可扩展性和可维护性。
二、编码和规范*在所有类、命名空间(namespace)和文件名中使用一致的命名约定,有助于保持代码的良好结构和可读性。
1) Classes类名只能包含字母和数字。
允许包含数字,但是大部分情况下不建议使用,除非这些数字是专业术语的一部分。
不要使用下划线,连字符等非数字字母符号。
例如:eful_util.Debug_Toolbar is discouraged2.MyCompany.util.Base64 is acceptable3.类名应该包含在使用点号分隔的命名空间中。
至少,要有一个顶级命名空间。
例如:1.MyCompany.data.CoolProxyMyCompany.Application顶级命名空间和实际的类名应使用驼峰命名(CamelCased),其他则为小写。
例如:1.MyCompany.form.action.AutoLoad不是Sencha开发的类(即不是Ext自带的)不要使用Ext做为顶级命名空间。
缩写也要遵守以上的驼峰式命名约定。
例如:1.Ext.data.JsonProxy instead of Ext.data.JSONProxy2.MyCompany.util.HtmlParser instead of MyCompary.parser.HTMLParser3.MyCompany.server.Http instead of MyCompany.server.HTTP2) 代码文件类名对应类所在的文件(包括文件名)。
因此,每个文件应该只包含一个类(类名和文件名一样)。
例如:Ext.util.Observable 存放在path/to/src/Ext/util/Observable.jsExt.form.action.Submit 存放在path/to/src/Ext/form/action/Submit.jsMyCompany.chart.axis.Numeric 存放在path/to/src/MyCompany/chart/axis/Numeric.js path/to/src 是你的应用所在目录。
所有类都应该在这个通用根目录下,并且使用适当的命名空间以利于开发、维护和部署。
3)方法和变量•和类命名一样,方法和变量也只能包含字母和数字。
数字同样是允许但不建议,除非属于专业术语。
不要使用下划线,连字符等任何非字母数字符号。
•方法和变量名一样使用驼峰式命名,缩写也一样。
•举例•合适的方法名:encodeUsingMd5() getHtml() 代替getHTML()getJsonResponse() 代替getJSONResponse()parseXmlContent() 代替parseXMLContent()•合适的变量名:var isGoodNamevar base64Encodervar xmlReadervar httpServer4)属性∙类属性名称遵循以上的变量和方法命名约定.除非是静态的常量.∙类的静态属性常量应该全部大写。
例如:o Ext.MessageBox.YES = "Yes"o Ext.MessageBox.NO = "No"o MyCompany.alien.Math.PI = "4.13"三、DIY,,,1).声明1.1) 旧的方式如果你曾经使用过旧版本的extjs,那么你肯定熟悉使用Ext.extend来创建一个类:1: varMyWindow=Ext.extend(Object,{...});这个方法很容易从现有的类中继承创建新的类.相比直接继承,我们没有好用的API用于类创建的其他方面,诸如:配置、静态方法、混入(Mixins)。
呆会我们再来详细的重新审视这些方面。
现在,让我们来看看另一个例子:1: My.cool.Window = Ext.extend(Ext.Window, { ... });在这个例子中,我们创建我们的新类,继承Ext.Window,放在命名空间中。
我们有两个问题要解决:1,在我们访问My.cool的Window属性之前,My.cool必须是一个已有的对象.2,Ext.Window必须在引用之前加载.第一个问题通常使用space(别名Ext.ns)来解决.该方法递归创建(如果该对象不存在)这些对象依赖.比较繁琐枯燥的部分是你必须在Ext.extend之前执行Ext.ns来创建它们.1: Ext.ns('My.cool');2: My.cool.Window = Ext.extend(Ext.Window, { ... });第二个问题不好解决,因为Ext.Window可能直接或间接的依赖于许多其他的类,依赖的类可能还依赖其它类...出于这个原因,在ext4之前,我们通常引入整个ext-all.js,即使是我们只需要其中的一小部分.1.2) 新的方式在Extjs4中,你只需要使用一个方法就可以解决这些问题:Ext.define.以下是它的基本语法:1: Ext.define(className, members, onClassCreated);∙className: 类名∙members:代表类成员的对象字面量(键值对,json)onClassCreated: 可选的回调函数,在所有依赖都加载完毕,并且类本身建立后触发.由于类创建的新的异步特性,这个回调函数在很多情况下都很有用.这些在第四节中将进一步讨论例如:1: Ext.define('My.sample.Person', {2: name: 'Unknown',3:4: constructor: function(name) {5:if (name) {6: = name;7: }8:9:return this;10: },11:12: eat: function(foodType) {13: alert( + " is eating: " + foodType);14:15:return this;16: }17: });18:19:var aaron = Ext.create('My.sample.Person', 'Aaron');20: aaron.eat("Salad"); // alert("Aaron is eating: Salad");注意我们使用Ext.create()方法创建了My.sample.Person类的一个新实例.我们也可以使用新的关键字(new My.sample.Person())来创建.然而,建议养成始终用Ext.create来创建类示例的习惯,因为它允许你利用动态加载的优势.更多关于动态加载信息,请看入门指南:入门指南2).配置在ExtJS 4 ,我们引入了一个专门的配置属性,用于提供在类创建前的预处理功能.特性包括:∙配置完全封装其他类成员∙getter和setter.如果类没有定义这些方法,在创建类时将自动生成配置的属性的getter和setter方法。
∙同样的,每个配置的属性自动生成一个apply方法.自动生成的setter方法内部在设置值之前调用apply方法.如果你要在设置值之前自定义自己的逻辑,那就重载apply方法.如果apply没有返回值,则setter不会设置值.看下面applyTitle的例子:1: Ext.define('My.own.Window', {2:/** @readonly */3: isWindow: true,4:5: config: {6: title: 'Title Here',7:8: bottomBar: {9: enabled: true,10: height: 50,11: resizable: false12: }13: },14:15: constructor: function(config) {16:this.initConfig(config);17:18:return this;19: },20:21: applyTitle: function(title) {22:if (!Ext.isString(title) || title.length === 0) {23: alert('Error: Title must be a valid non-empty string');24: }25:else {26:return title;27: }28: },29:30: applyBottomBar: function(bottomBar) {31:if (bottomBar && bottomBar.enabled) {32:if (!this.bottomBar) {33:return Ext.create('My.own.WindowBottomBar', bottomBar);34: }35:else {36:this.bottomBar.setConfig(bottomBar);37: }38: }39: }40: });以下是它的用法:1:var myWindow = Ext.create('My.own.Window', {2: title: 'Hello World',3: bottomBar: {4: height: 605: }6: });7:8: alert(myWindow.getTitle()); // alerts "Hello World"9:10: myWindow.setTitle('Something New');11:12: alert(myWindow.getTitle()); // alerts "Something New"13:14: myWindow.setTitle(null); // alerts "Error: Title must be a valid non-empty string"15:16: myWindow.setBottomBar({ height: 100 }); // Bottom bar's height is changed to 1003.Statics静态成员可以使用statics配置项来定义1: Ext.define('Computer', {2: statics: {3: instanceCount: 0,4: factory: function(brand) {5:// 'this' in static methods refer to the class itself6:return new this({brand: brand});7: }8: },9:10: config: {11: brand: null12: },13:14: constructor: function(config) {15:this.initConfig(config);16:17:// the 'self' property of an instance refers to its class18:this.self.instanceCount ++;19:20:return this;21: }22: });23:24:var dellComputer = Computer.factory('Dell');25:var appleComputer = Computer.factory('Mac');26:27:alert(appleComputer.getBrand()); // using the auto-generated getter to get the value of a config property. Alerts "Mac"28:29: alert(Computer.instanceCount); // Alerts "2"四.错误处理&调试Extjs 4包含一些有用的特性用于调试和错误处理.你可以使用Ext.getDisplayName()来显示任意方法的名字.这对显示抛出异常的类和方法非常有用.1:throw new Error('['+ Ext.getDisplayName(arguments.callee) +'] Some message here');当使用Ext.define()定义的类中的方法抛出异常后.你将在调用堆栈中看到类和方法名(如果你使用webkit).例如,以下是chrome浏览器的效果:javascript是一种类无关(原文:classless)、基于原型的语言。