收藏 分享(赏)

ExtJs笔记.doc

上传人:weiwoduzun 文档编号:5641948 上传时间:2019-03-10 格式:DOC 页数:87 大小:1.12MB
下载 相关 举报
ExtJs笔记.doc_第1页
第1页 / 共87页
ExtJs笔记.doc_第2页
第2页 / 共87页
ExtJs笔记.doc_第3页
第3页 / 共87页
ExtJs笔记.doc_第4页
第4页 / 共87页
ExtJs笔记.doc_第5页
第5页 / 共87页
点击查看更多>>
资源描述

1、ExtJs 学习笔记目录1. ExtJs 结构树 22. 对 ExtJs 的态度 33. Ext.form 概述 44. Ext.TabPanel 篇 .55. Function 扩展篇 .76. Ext.data.Store 篇 .107. Ext.data.JsonReader 篇一 .128. Ext.data.JsonReader 篇二 .159. Ext.data.HttpProxy 篇 .1910. Ext.data.Connection 篇一 .2011. Ext.data.Connection 篇二 .2412. Ext.Updater 篇一 2613. Ext.Updater

2、 篇二 2714. JSON 序列化篇 .3315. 通信篇 3516. extJs 2.0 学习笔记(Ajax 篇) 3817. extJs 2.0 学习笔记(Ext.data 序论篇) .3918. extJs 2.0 学习笔记(Ext.Panel 终结篇) 4019. extJs 2.0 学习笔记(事件注册总结篇) .4520. extJs 2.0 学习笔记(Ext.Panel 篇一) 4821. extJs 2.0 学习笔记(Ext.Panel 篇二) 5022. extJs 2.0 学习笔记(Ext.Panel 篇三) 5923. extJs 2.0 学习笔记(Ext.Panel 篇

3、四) 6224. extJs 2.0 学习笔记(组件总论篇) .6625. extJs 2.0 学习笔记(Ext.Element API 总结) 6926. extJs 2.0 学习笔记(Element.js 篇) .7327. extJs 2.0 学习笔记(DomHelper.js 篇) .7628. extJs 2.0 学习笔记(ext.js 篇) 771. ExtJs 结构树2. 对 ExtJs 的态度extjs 的确是个好东西,但是,它的优点也就是它的缺点: 加载页面慢 时间一长,浏览器占内存就会疯长 服务器端功能极度削弱,除了数据库操作外,几乎所有功能都到了客户端,还得用 javas

4、cript 来写。 功能全到了客户端,而客户端语言 javascript 的编写还是有许多的麻烦,真正精通它的人极少。 javascript 对于大部分人来说,不易调试 大量存在的 javascript 代码难以维护 开发速度极慢。 extjs 本身还存在一些问题正是因为有这么多的问题,老板们都得掂量一下了。用它倒底值不值。当然,这儿也得说一下它的优点: 因为一切都是 javascript 搞定,所以,界面上的问题再也不像以前一样让人郁闷了,客户端对界面的的操作取得极大的便利,而不像以前一样,服务器端生成 n 多垃圾代码,以前的时代就彷佛隔靴搔痒,服务器端企图布置好一切。现在不同了,客户端用一

5、个Ext.Ajax.Request 请求数据方便,然后,显示出来也容易。 又回到了 c/s 时代。c/s 让人神往啊。web 该死的无状态让人郁闷 学习 extjs 的一个极大的好处,所有当前 web 开发界面上的需求都可以在这儿找到答案。通过研究它的代码,我们可以开发出自己的ajax 框架来,可以写出适合于自己的 widgets 来。而不用背着extjs 那个大乌龟壳。我认为,不宜用 extjs 来开发整个应用,但是,在极为需要的地方用一用,还是蛮好的,整个站点都用它那就麻烦了。现在我对于选择 ajax 框架有了一点心得。不要使用 extjs 来开发,但是,一定要学习、研究它,研究它之后才会

6、晓得,我们写代码应当这么写才优美、才合适。研究了它后就应当选一款轻量型的框架了。然后自己写组件。用以取代:Ext.Window、Ext.TabPanel、Ext.Panel这些好东西。研究了 extjs,我敢说:一览众山小啊!什么 prototype、dojo、jQuery 之类,就容易多了。真正要用的 ajax 框架,我看,倒不如选择 prototype,它是个轻量型,我觉得,一个 ajax,只要封装了三个东西就行了:一、Element。把 dom 元素要封装一下,加入动画、求取、设置各种参数值的功能二、XMLHttpRequest,要把它封装一下,这个所有框架都做了三、把事件机制要封装一下

7、,最好像 extjs 一样,xxx.on(click,function();就成了。有了这三个就差不多了,那些什么 window、 tabs,网上多的是代码,搞些下来改篇改篇就成了。关于 prototype,我找到了 它的中文文档(1.5 的),1.5 的大小是 93.7k,事实上,这个大小还可以缩小,可以使用工具去掉多余的空格,差不多了。3. Ext.form 概述Ext.form 中封装了是输入组件。input、textArea、frameSet、form 等元素都被包装起来了。我刚才发了点时间对它的类图分析了一下,用 StartUML 做了图如下:Ext.form 中的组件太多,实在不大

8、4. Ext.TabPanel 篇Ext.TabPanel 这个东西是最常用的组件之一,它继承自 Ext.Panel。看了一个下午的源代码,对它的一些基本原理有所了解了。下面要讲一些问题,这些问题绝对是本人独门秘笈,非入室弟子不传。哈哈哈。一、组件的组成:因为继承自 Ext.Panel,所以,它也是由 header、tbar、body、bbar、footer 这几个部分构成,有人问:TabPanel 的面板标签是在哪儿呢 (就是你点击换页的东西)?它默认是放在 header 中的。但是,如果设置了:tabPosition 的话就不一定了,tabPosition 可取两个值:top 、botto

9、m 。所以,标签可以是放在下面,但是,Ext 目前还不支技放在左边、右边。那么,不同的标签是用什么元素来组织的呢?用 ul。一页对应一个 li。li 的 id 的取值有规律哦,它的取值公式如下:tabpanel.id+tabpanel.idDelimiter+面板的 id。正是因为有了这个规律,才能根据点击的标签而找到对应的面板。这个问题是一大主题,在下面讲。这是面板的标签,下面的面板呢?简单!一个 Ext.Panel 对应一个面板,注意:这儿的面板是没有 header 的,如果你想 tab.items.get(1).header,在这儿,header=undefined。为什么为面板定义的t

10、itle 会对应到标签中去呢?这个是 TabPanel 的特意处理的。至于换页效果是怎么出来的? CardLayout。这下组件的大概结构都清楚了。还有不明白,自己 new Ext.TabPanel()一个,然后在 FireBug 下面去查看 dom 结构,就一清二楚了。二、处理标签的事件为什么要研究这个问题?有需求的,如何在鼠标移到标签上时就显示对应的面板呢?默认情况下,TabPanel 是不支持这个功能的,但是,这个功能有时是需要的。这儿有点小技巧。看 Ext.TabPanel 源代码中关于标签的事件处理:this.strip.on(mousedown, this.onStripMouse

11、Down, this);this.strip.on(click, this.onStripClick, this);this.strip.on(contextmenu, this.onStripContextMenu, this);if(this.enableTabScroll)this.strip.on(mousewheel, this.onWheel, this);这段代码写在 initEvents 函数中,先解释一下,this.strip 是指头部放标签的那个 ul 元素,相信,98%的读者会想,要注册事件也应当是为 li 元素注册,怎么会统统注册到 ul 这个父容器上面呢?原理就是事件

12、冒泡。关于事件传递的原理,本人在下一文中有详细的实验、明确的结论,不再赘言。ul 元素捕获了事件,怎样在事件处理函数中得知倒底是哪个 li 发生了事件呢?Ext 写了个函数:findTargets。详情请见如下代码:findTargets : function(e)var item = null;var itemEl = e.getTarget(li, this.strip);if(itemEl)item = this.getComponent(itemEl.id.split(this.idDelimiter)1);if(item.disabled)return close : null,it

13、em : null,el : null;return close : e.getTarget(.x-tab-strip-close, this.strip),item : item,el : itemEl;,/ privateonStripMouseDown : function(e)e.preventDefault();if(e.button != 0)return;var t = this.findTargets(e);if(t.close)this.remove(t.item);return;if(t.item ,一切的关键就在于 li 元素的 id 的命名规则,从中取出对应的面板的 i

14、d,这样就能 getComponent,从而获得对应的面板引用,再 setActiveTab 就办成了。至于 getTarget 这个是 EventObject 中封装的函数,作用是在事件传播路径上查找满足指定选择条件的元素。这个函数的详情见它的源码。到了这里,之前所讲的鼠标悬停问题只要依照方面方法解决就是了,切记,不要处理 mouseout 事件,不然,事情就麻烦了,详情见我以前写过的关于 mouseover 事件的一篇文章。5. Function 扩展篇ExtJs 对 JavaScript 的内建对象进行了扩展,对什么 Object、Date、Array、Function、String 的

15、扩展,扩展方法想必诸位都烂熟于心了:用 prototype 的办法。这一篇讲一讲 Function 扩展的精妙之处,之所以突然研究这个问题,是因为我在研究 Ext.data.Store 的源代码时,看到一行代码:this.reader.onMetaChange = this.onMetaChange.createDelegate(this);当初,我在研究 Ext.js 中的代码时,对于 Function 的几个扩展想不透、看不明,今日大悟。且见扩展的源代码:createDelegate : function(obj, args, appendArgs)var method = this;re

16、turn function() var callArgs = args | arguments;if(appendArgs = true)callArgs = Array.prototype.slice.call(arguments, 0);callArgs = callArgs.concat(args);else if(typeof appendArgs = “number“)callArgs = Array.prototype.slice.call(arguments, 0); / copy arguments firstvar applyArgs = appendArgs, 0.conc

17、at(args); / create method call paramsArray.prototype.splice.apply(callArgs, applyArgs); / splice them inreturn method.apply(obj | window, callArgs);,createDelegate 函数的作用是,为指定函数创建一个回调函数,注意是创建一个新的函数返回,它返回的是一个新函数。我以前一直不明白,为什么要这么做,就像上面红色的那行代码,相信大伙与我一样,都在想,为什么不是写成这样:this.reader.onMetaChange=this.onMetaCh

18、ange;不是应当这样写的吗?如果用过 dotnet,那么委托一定是晓得了,javascript 中的函数跟 c#的委托一样,有很相近的意义,为什么 c#中能这样写,JavaScript 中不能这样写呢?一切都因为 this,this 这个东西见风使舵,像上面 onMetaChange 这函数,实际调用时是在 reader中,那么如果 onMetaChange 中使用了 this 关键字,那么,this 是指向 reader 的,而不是指向onMetaChange 的定义环境所对应的 this。而事实上,我们往往想把这个 this 指向函数的定义环境,这也正是回调的最招人喜欢的地方,然而,因为

19、 this 的问题,回调就不能像上面那样直接赋值。还得做些手脚,得让函数调用时 scope 为当前定义环境。改变一个函数执行的 scope,熟翻 JavaScript 的兄弟一定晓得要用: call、apply。至此,createDelegate 的产生背景、作用都作了个交代。createDelegate(this),调用时,一般直接传个 this 就行了,当真是妙啊。事实上,我上面讲的一通道理清楚了,这个函数的代码就没有秘密可言了。关键就是一个 this。我现在感叹,你对 JavaScript 的造诣与你对 this 的领悟层次成正比。既然讲了 createDelegate,其他几个扩展函数

20、一并讲了。createCallback : function(/*args.*/)/ make args available, in function belowvar args = arguments;var method = this;return function() return method.apply(window, args);也是创建调用者的回调,不过,回调函数的 scope 为 window。相当于 createDelegate(window)。没什么讲的。defer : function(millis, obj, args, appendArgs)var fn = this

21、.createDelegate(obj, args, appendArgs);if(millis)return setTimeout(fn, millis);fn();return 0;,此函数调用一次就让函数延迟调用一次。对 setTimeout 的封装罢了。如果没有定义延时参数,那么就马上执行。这个函数也没有技术性可言。createSequence : function(fcn, scope)if(typeof fcn != “function“)return this;var method = this;return function() var retval = method.appl

22、y(this | window, arguments);fcn.apply(scope | this | window, arguments);return retval;,这个函数就有点意思了,刚开始研究 ext.js 的时候还没有看明白,它的作用是在返回一个函数,此函数先调用“调用函数”,后调用传递进来的函数。这句话可能还没说清,见示例如下:function A()alert(“第一个执行!“);return 1;function B()alert(“第二个执行!“);return 2;function C()alert(“第三个执行!“);return 3;var D=A.createS

23、equence(B).createSequence(C);var result=D();上面代码产生的效果是:第一弹出框显示:第一个执行!第二弹出框显示:第二个执行!第三弹出框显示:第三个执行!result 的值为: 3。这下子诸位都明白了吧。用过 dotnet 的知道,委托变量有这种类似的功能。就是累加执行的效果。createInterceptor : function(fcn, scope)if(typeof fcn != “function“)return this;var method = this;return function() fcn.target = this;fcn.met

24、hod = method;if(fcn.apply(scope | this | window, arguments) = false)return;return method.apply(this | window, arguments);这个函数也有点意思,有创意,它返回被调用函数的回调,这个回调是条件执行的,执行条件是createInterceptor 传入的那个函数返回真。示例代码如下:function A()var B=A.createInterceptor(function(i)return i0;);B(1),则 A 被执行,如果调用 B(-1),A 则不被执行。B 的作用就是如

25、果传入的第一个参数的值大于0 时 A 才被执行,否则不执行。相当于原有函数的功能不变,只是加个执行条件。这个想法着实巧妙。这一招现在想来,也可以用到c#中。6. Ext.data.Store 篇Ext.data.Store,这个东西是 JavaScript 版的 DataTable 啊。貌似其他 Ajax 框架都没有这个玩意啊。可见啦,Ext 是真的打算把 b/s 开发重新变成 c/s 开发啊。哈哈哈。便宜我等了。待某细研之。Store 类提供对记录集(Record)的包装,通过前面的研究可知,DataProxy 取数据(url 或数组或 xml或 json),DataReader 用于从不规

26、范的数据取出并格式化指定结构的记录集。记录的结构由Record.create 创建。DataProxy 通过对 Connection 的调用取得数据(Response)后,在回调中调用 DataReader 的 read 函数,从而把 response 中的数据解析成记录集,这个记录集将再以回调参数的形式传出来,store 实现这个回调,并把里面的 Recodrd取出来,放到 data 这个成员中。store.data 是一个 MixedCollection 对象,MixedCollection 作什么用的前面也讲过,它本质就是一个容器, ExtJs 确实很好,连容器类都写了。有了 store

27、.data,数据进了这儿,就好办了,store 调用 MixedCollection 的功能,实现了一些通用的函数,如取指定成员、查询、遍历、事务等等,这些都不足道。什么提交修改、取消修改的功能却是根源于 Record。Record 类自身就封装了这个功能,Store 中只是再次封装罢了,这个原理也很简单。看代码即知。上面讲的是通用原理,是大概,下面拣紧要的代码说一下。它定义了构造函数,继承自 Ext.Observable。第一行代码就是个重点:this.data = new Ext.util.MixedCollection(false);这是定义 data,所有记录都将保存在它里面。this

28、.baseParams = ;/ privatethis.paramNames = “start“ : “start“,“limit“ : “limit“,“sort“ : “sort“,“dir“ : “dir“;baseParams 将在调用 HttpProxy 时用到,它将作为 params 附加到 url 末尾。这个东西没有悬念。至于 paramsNames 用于保存参数名,start 、limit 应当用于分页,sort、dir 用于排序,不过,我看了通篇的代码,发现,Store 本身不提供任何其他分页、排序功能的实现,还是得依靠服务器端的。只不过,这儿提供一种统一的方式罢了。if(

29、config delete config.data;意思是说,如果创建 store 时,设了 config,且 config.data 存在,那么,将直接从 config.data 中loadData。构造函数后面一点就有。inlineData 这个属性没活多久就被 delete 了。if(this.url if(this.reader) / reader passedif(!this.recordType)this.recordType = this.reader.recordType;if(this.reader.onMetaChange)this.reader.onMetaChange

30、= this.onMetaChange.createDelegate(this);if(this.recordType)this.fields = this.recordType.prototype.fields;就是根据 config 中的情况,创建成员: proxy,reader ,recordType,onMetaChange。这了这四个,就好方便在下面定义的 load 中加载数据并完全记录集的封装。说出来一文不值。this.modified = ;这个东西用于保存那些有修改过的记录的旧值。之所以能取消修改,正是源于此啊。关于 addEvents 那个语句,就没必要讲了,大伙都懂。if(

31、this.proxy)this.relayEvents(this.proxy, “loadexception“);this.sortToggle = ;if(this.sortInfo)this.setDefaultSort(this.sortInfo.field, this.sortInfo.direction);Ext.data.Store.superclass.constructor.call(this);if(this.storeId | this.id)Ext.StoreMgr.register(this);if(this.inlineData)this.loadData(this.

32、inlineData);delete this.inlineData;else if(this.autoLoad)this.load.defer(10, this, typeof this.autoLoad = object ?this.autoLoad : undefined);第一个语句中主要就是一个 relayEvents,意为延迟事件,这个延迟不是时间延迟哦。它是将当前对像的某些事件处理函数作为另一个对象的处理函数,同者共享,事实上,它的作用就是利用另一对象的事件来触发本对象的事件,从而引发事件处理函数的执行(说得太拗口了吧) 。那个 inlineData 上面讲了的,现在应验了,不多

33、讲。从这儿可以看出,如果已从 config 中传过来数据,那么以直接传的数据为准,如果没有直接传数据,而是通过 url,且 autoLoad 为 true,这时就在构造函数中加载数据且完全数据的封装。重点代码至此讲了一半,另一半就是 load、loadRecords 了。7. Ext.data.JsonReader 篇一嘿,别看关键就在这儿,事实上,它的代码很少的哦。加上注释才 219 行。研究研究。有个事要说一下:DataProxy 的子类呢,都有一个 load 来加载数据, DataReader 的子类呢,都有一个 read 来读取数据。而 Ext.data.JsonReader 有两个关

34、键函数:read、readRecords。好了。来研究一下。Ext.data.JsonReader = function(meta, recordType)meta = meta | ;Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType | meta.fields);这是构造函数。简单。meta 是数据格式定义,recordType 是记录类型。其中 recordType 可以是一个定义记录的数组,也可以不传,而把记录的各个字段的定义放到 meta 中的 fields 字段中。且看它对父类构造函数的调用:

35、Ext.data.DataReader = function(meta, recordType)this.meta = meta;this.recordType = Ext.isArray(recordType) ? Ext.data.Record.create(recordType) : recordType;Ext.data.DataReader.prototype = ;这下全明白了吧。recordType 可以是记录类型,可以是字段定义数组,还可以不传。所以,构造函数就是定义两个属性:meta、recordType。这两东西后面有用。这个 meta、 recordType 组成如何?这

36、个必须说明,不然,这个类也就没法用了。meta:totalProperty json 数据中,保存总记录数的属性successProperty json 数据中,保存是否返回成功的属性名root json 数据中,保存记录集的属性的属性名id json 数据中,记录中主键所对应的列的属性名recordType:这个东西,事实上要去看 Ext.data.Record 的 create 函数的文档,我且把它翻译一下,如下:create( Array o ) : function创建包含指定字段结构的继承自 Ext.data.Record 的类。静态方法。参数:o : Array一个定义记录结构的字

37、段信息数组。每个数组元素包含 name,其他可选的有:mapping、type。通过它们,可以让 Ext.data.Reader 从一个数据对象中获取各字段的值。每个字段定义对象都可能包含如下属性:name : String在记录中标志一个字段的名字。它通常用于引用指定字段,例如,在定义Ext.grid.ColumnModel 的 dataIndex 属性时,要传过去的。mapping : String当在 Ext.data.Reader 中创建记录时,如何将 json 对象中指定属性值映射到此字段。type : String字段的类型,可能值为:auto(默认值,没有任何转化)、string

38、、int、float、boolean 、datesortType : MixedExt.data.SortTypes 中的一个成员。sortDir : String排序方式,“ASC“ 或者 “DESC“。convert : Function如果要对这个字段的值进行一些物殊处理,这时需要一个能定制的回调,用它来手工处理值。它的参数如下:v : Mixed通过 mapping 映射找到的值。已从 json 中取出来的。rec : Mixed在 json 中的,对应于此记录的 json 对象。dateFormat : String用于 Date.parseDate 函数的格式化字符串。defaul

39、tValue : Mixed当字段值在原数据中不存在时所取的默认值,默认为空字符串。用法:var TopicRecord = Ext.data.Record.create(name: title, mapping: topic_title,name: author, mapping: username,name: totalPosts, mapping: topic_replies, type: int,name: lastPost, mapping: post_time, type: date,name: lastPoster, mapping: user2,name: excerpt, m

40、apping: post_text);var myNewRecord = new TopicRecord(title: Do my job please,author: noobie,totalPosts: 1,lastPost: new Date(),lastPoster: Animal,excerpt: No way dude!);myStore.add(myNewRecord);好了,这一篇差不多了,未尽内容放下一篇中了。8. Ext.data.JsonReader 篇二有了上一篇中所讲内容,一般情况下就可以应付了,不过,JsonReader 有一些细节问题,还要细究。待某家一一道来。构

41、造函数已讲,下面依代码顺序讲解了。read : function(response)var json = response.responseText;var o = eval(“(“+json+“)“);if(!o) throw message: “JsonReader.read: Json object not found“;return this.readRecords(o);,这个是整个 JsonReader 的关键所在了。君可找到 Ext.data.HttpProxy 中的 loadResponse 函数,里面有这么一行代码:result = o.reader.read(respons

42、e);可见,是 proxy 里面调用 reader.read 方法才得以取出结果集的。这是要表明:read 乃 JsonReader三军中军之所在。read 又调用 readRecords,read 把 json 字符串转化为对象然后交给 readRecords。这个本无不妥,但是, 中,它的结果有点曲折,结果是放在 o.d 中,而不能直接从 o 中取得。所以,事实上应当这么写:this.readRecords(o.d)。这就成了。继续往下面看:onMetaChange : function(meta, recordType, o)这个函数说是要由 store 实现的,现在不知道它的用处。还往

43、下看:simpleAccess: function(obj, subsc) return objsubsc;,getJsonAccessor: function()var re = /./;return function(expr) try return(re.test(expr)? new Function(“obj“, “return obj.“ + expr): function(obj)return objexpr; catch(e)return Ext.emptyFn;(),取一对象的属性有两种方法,前面都已提及:一、obj.xxxx二、objxxxx这两种都行。但是,如果传过来一个

44、对象,已知其对象的引用 obj,但是有的只是它的属性名的字符串,这时就可以用第二种方法取出,但是,如属性名中含,那么就不大方便了,又或者是属性又带属性,这事也只能用第一种方法。这两个函数正是为事而来。且看那 getJsonAccessor,着实巧妙,函数返回一函数,这不是巧妙之处,这个我以前就见识了,关键在于 new Function(“obj“,“return “obj.“+expr)。多么巧妙啊。此之中巧,不足以言语道哉。这下面就是真正的好戏了,看一看 readRecords 函数。this.jsonData = o;if(o.metaData)delete this.ef;this.me

45、ta = o.metaData;this.recordType = Ext.data.Record.create(o.metaData.fields);this.onMetaChange(this.meta, this.recordType, o);定义一个 jsonData 属性以保存原始 json 对象。然后如果传过的 json 对象中就有 metaData。那么,就用它自带的 meta 来取代 JsonReader 构造函数中所传入的 meta。以原来自带的为主。这个功能方档未曾提及,但我辈不可不察也。var s = this.meta, Record = this.recordType

46、,f = Record.prototype.fields, fi = f.items, fl = f.length;有人不理解了,为什么非得这样呢?这是节省带宽啊。如果这些东西以后多说现几次,那么每个用户都要多下载一些东西,成千上万人能节省多少啊。if (!this.ef) if(s.totalProperty) this.getTotal = this.getJsonAccessor(s.totalProperty);if(s.successProperty) this.getSuccess = this.getJsonAccessor(s.successProperty);this.get

47、Root = s.root ? this.getJsonAccessor(s.root) : function(p)return p;if (s.id) var g = this.getJsonAccessor(s.id);this.getId = function(rec) var r = g(rec);return (r = undefined | r = “) ? null : r; else this.getId = function()return null;this.ef = ;for(var i = 0; i DataReaderStore。当然,三个部分都得是具体的类,这三个是

48、抽象类。如果按照一般性的理解,那么应当先从 Proxy 开始了。出人意料:DataProxy 的代码就是一空架子。且看:Ext.data.DataProxy = function()this.addEvents(beforeload,load);Ext.data.DataProxy.superclass.constructor.call(this);Ext.extend(Ext.data.DataProxy, Ext.util.Observable);就是加两事件,从 Observable 继承了。如此而己,看代码就看晴晰了。再看一看 HttpProxy,它的代码也就一百来行。比起其他类来说,真是小巫见大巫了。先为 Ext.data.HttpProxy 给个描述吧:从一个 Ext.data.Connection 中读取数据到一个数据对象、从Ext.data.DataProxy 继承的类。这个类不能跨站出数据,记住了 。此类构函数的文档中说:HttpProxy( Object conn )conn 是一个 connection 对象或者是一个传给 Ext.Ajax.request 的 options。如果传给它的是一个options,那么,将使用 Ext.Ajax.request 获取数据。这个地方要注意一下。下面来讲一下 load 函数,Htt

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报