如果你未曾下载过Q那应从q里下蝲最新版本的Ext http://extjs.com/downloads?/p>
针对你的下蝲需求,有几个不同的Ҏ选项。通常圎ͼ最E_的版本,是较多h的选择。下载解包后Q那个example文g夹便是一个探索Ext的好地方Q?/p>
我们用ExtQ来完成一些JavaScriptd?/p>
Zip文g包括三个文gQ?strong>ExtStart.html, ExtStart.js?strong>ExtStart.css。解包这三个文g到Ext的安装目录中Q例如,Ext是在“C:\code\Ext\v1.0”中,那应该在"v1.0"里面新徏目录“tutorial”。双?strong>ExtStart.htmQ接着你的览器打开启动面Q应该会有一条消息告诉你配置已完毕。如果是一个Javascript错误Q请按照面上的指引操作?/p>
在你常用的IDE中或文本~辑器中Q打开ExtStart.js看看Q?/p>
Ext.onReady可能是你接触的第一个方法。这个方法是指当前DOM加蝲完毕后,保证面内的所有元素能被Script引用QreferenceQ。你可删除alert()那行Q加入一些实际用途的代码试试Q?/p>
Ext.onReady(function() { alert("Congratulations! You have Ext configured correctly!"); });
大多数的JavaScript操作都需要获取页面上的某个元素(referenceQ?好让你来做有的事情。传l的JavaScriptҎQ是通过ID获取Dom节点的:
var myDiv = document.getElementById('myDiv');
q毫无问题,不过q样单单q回一个对象(DOM节点Q,用v来ƈ不是太强大和好用。ؓ了要用那节点q点事情Q你会要写不少自定义的代码Q另外,对于不同cd览器之间的差异Q要你处理v来可真头大了?/p>
q入Ext.element 对象。元素(elementQ的的确是Ext的心脏地带,--无论是访问元素(elementsQ还是完成一些动作,都要涉及它。Element的API是整个Ext库的基础Q如果你旉不多Q只想了解Ext中的一个类的话QElement一定是首选!
由ID获取一个Ext Element如下Q首ExtStart.htm包含一个divQID名字?#8220;myDiv”Q然后,在ExtStart.js中加入下列语句)Q?/p>
Ext.onReady(function() {var myDiv = Ext.get('myDiv');});
再回头看看Element对象Q发C么有的东东呢?
q意味着你可用最的代码来做各种各样的事情,q里仅仅是一个简单的例子Q完整的列表在ElementAPI中)?/p>
l箋在ExtStart.js中,在刚才我们获取好myDiv的位|中加入Q?/p>
myDiv.highlight(); //黄色高亮昄然后渐退 myDiv.addClass('red'); // d自定义CSSc?(在ExtStart.css定义) myDiv.center(); //在视图中元素居? myDiv.setOpacity(.25); // 使元素半透明
通常情况下,不能由ID获取多个DOM的节点,有可能因为没讄ID,或者你不知道ID,又或者直接用ID方式引用有太多元素了。这U情况下Q你会不用ID来作取元素的依据Q可能会用属性(attributeQ或CSS Classname代替。基于以上的原因QExt引入了一个功能异常强大的Dom Selector库,叫做DomQuery?/p>
DomQuery可作为单独的库用,但常用于ExtQ你可以在上下文环境中(ContextQ获取多个元素,然后通过Element接口调用。幸q的是,Element对象本n便有Element.selcect的方法来实现查询Q即内部调用DomQuery选取元素。这个简单的例子中,ExtStart.htm包含若干D落Q?lt;p>标签Q,没有一个是有ID的,而你惌村֜通过一ơ操作马上获取每一D,全体执行它们的动作,可以q样做:
// 每段高亮昄 Ext.select('p').highlight();
DomQuery的选取参数是一D较长的数组Q其中包括W3C CSS3 Dom选取器、基本XPatch、HTML属性和更多Q请参阅DomQuery API文档以了解这功能强大的库的细节?/p>
到这范例为止Q我们所写的代码都是攑֜onReady中,卛_面加蝲后M立即执行Q功能较单一——这L话,你便知道Q如何响应某个动作或事g来执行你希望做的事情Q做法是Q先分配一个functionQ再定义一个event handler事g处理器来响应。我们由q个单的范例开始,打开ExtStart.htmQ编辑下列的代码Q?/p>
Ext.onReady(function() { Ext.get('myButton').on('click', function(){ alert("You clicked the button"); }); });
加蝲好页面,代码依然会执行,不过区别是,包含alert()的function是已定义好的Q但它不会立卛_被执行,是分配到按钮的单M件中。用显的文字解释,是Q获取ID?myDottom'元素的引用,监听M发生元素被单ȝ情况Qƈ分配一个function,以准备Q何单d素的情况?/p>
正\来说QElement.select也能做同L事情Q即作用在获取一l元素上。下一例中Q演CZ面中的某一D落被单dQ便有弹出窗口:
Ext.onReady(function() { Ext.select('p').on('click', function() { alert("You clicked a paragraph"); }); });
q两个例子中Q事件处理的function均是单几句,没有函数的名Uͼq种cd函数UCؓ“匿名函数Qanonymous functionQ?#8221;Q即是没有名的的函数。你也可以分配一个有名字的event handler,q对于代码的重用或多个事件很有用。下一例等效于上一例:
Ext.onReady(function() { var paragraphClicked = function() { alert("You clicked a paragraph"); } Ext.select('p').on('click', paragraphClicked); });
到目前ؓ止,我们已经知道如何执行某个动作。但当事件触发时Q我们如何得知这个event handler执行时是作用在哪一个特定的元素上呢Q要明确q一炚w常简单,Element.onҎ传入到even handler的function中(我们q里先讨论第一个参敎ͼ不过你应该浏览API文档以了解even handler更多的细节)。在我们之前的例子中Qfunction是忽略这些参数的Q到q里可有许的改变,——我们在功能上提供了更深层次的控制。必d说明的是Q这实际上是Ext的事件对象(event objectQ?一个跨览器和拥有更多控制的事件。例如,可以用下列的语句Q恢复这个事件的指定的DOM节点Q?br />
Ext.onReady(function() { var paragraphClicked = function(e) { Ext.get(e.target).highlight(); } Ext.select('p').on('click', paragraphClicked); });
注意指定的是DOM节点Q所以我们首先将其恢复成为适当的元素,然后执行Ʋ完成的事gQ这个例子中Q我们看见段落是高亮昄的?br />
除了我们已经讨论q的核心JavaScript库,现在的Ext亦包括了一pd的最前端的JavaScirptUIlg库。文本以一个最常用的widgetZ子,作简单的介绍?/p>
比v略ؓ沉闷?#8220;HelloWolrd”消息H口Q我们做许变化Q前面我们写的代码是Q单L个段落便会高亮显C,现在是单L落,在消息窗口中昄D落内容出来?br /> 在上面的paragraphClicked的function中,这行代码:
Ext.get(e.target).highlight();
替换为:
var paragraph = Ext.get(e.target); paragraph.highlight(); Ext.MessageBox.show({ title: 'Paragraph Clicked', msg: paragraph.dom.innerHTML, width:400, buttons: Ext.MessageBox.OK, animEl: paragraph });
q里有些新的概念讨论一下。在W一行中我们创徏了一个局部变量(Local VariableQ来保存某个元素的引用,卌单击的那个DOM节点Q本例中Q我们LD落paragrah,事因我们已经定义该事件与<p>标签发生兌的了Q。ؓ什么要q样做呢Q嗯...观察上面的代码,我们需要引用同一元素来高亮显C,在MessageBox中也是引用同一元素作ؓ参数使用?br /> 一般来_多次重复使用同一|ValueQ或对象Q是一个不好的方式Q所以,作ؓ一个好的OOP开发者,应该是将其分配到一个局部变量中Q反复用这变量Q?/p>
现在Q观察MessageBox的调用,准备作ؓ阐述新概늚演示用。乍一看,q像一q串的参C入到Ҏ中,但仔l看Q这是一个非常特别的语法。实际上Q传入到MessageBox.show的只有一个参敎ͼ一个Object literal,包含一l属性和属性倹{在Javascript中,Object Literal是动态的Q你可在M时候用{和}创徏一个典型的对象(object)。其中的字符׃pd的name/valuel成的属性,属性的格式是[property name]:[property value]。在整个Ext中,你将会经帔R到这U模式的语法Q因此你应该消耗掉q知识!
使用Object Literal的原因是什么呢Q主要的原因?#8220;韧性(flexibilityQ?Q随时可新增、删除属性,亦可不管序地插入。而方法不需要改变。这也是多个参数的情况下Qؓ最l开发者带来不的方便Q本例中的MessageBox.show())。例如,我们说这儿的foo.actionҎQ有四个参数Q而只有一个是你必M入的。本例中Q你惛_中的代码可能会是q样的foo.action(null, null, null, 'hello').,若果那方法用Object Literal来写Q却是这P foo.action({ param4: 'hello' })Q这更易用和易读?/p>
Gird是Ext中h们最惛_睹ؓ快的Widgets之一Q也是最行之一。好Q让我们看看怎么L地创Z个Girdq运行。用下列代码替换ExtStart.js中全部语句:
Ext.onReady(function() { var myData = [ ['Apple',29.89,0.24,0.81,'9/1 12:00am'], ['Ext',83.81,0.28,0.34,'9/12 12:00am'], ['Google',71.72,0.02,0.03,'10/1 12:00am'], ['Microsoft',52.55,0.01,0.02,'7/4 12:00am'], ['Yahoo!',29.01,0.42,1.47,'5/22 12:00am'] ]; var ds = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(myData), reader: new Ext.data.ArrayReader({id: 0}, [ {name: 'company'}, {name: 'price', type: 'float'}, {name: 'change', type: 'float'}, {name: 'pctChange', type: 'float'}, {name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'} ]) }); ds.load(); var colModel = new Ext.grid.ColumnModel([ {header: "Company", width: 120, sortable: true, dataIndex: 'company'}, {header: "Price", width: 90, sortable: true, dataIndex: 'price'}, {header: "Change", width: 90, sortable: true, dataIndex: 'change'}, {header: "% Change", width: 90, sortable: true, dataIndex: 'pctChange'}, {header: "Last Updated", width: 120, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'} ]); var grid = new Ext.grid.Grid('grid-example', {ds: ds, cm: colModel}); grid.render(); grid.getSelectionModel().selectFirstRow(); });
q看上去很复杂,但实际上加v来,只有七行代码。第一行创建数lƈ作ؓ数据源。实际案例中Q你很可能从数据库、或者WebService那里得到动态的数据。接着Q我们创建ƈ加蝲data storeQ?data store会告诉Ext的底层库接手处理和格式化q些数据。接着Q我们定义一个column模型Q用来轻村֜调配Gird的每一列参数。最后我们生成这个Gird,传入data store和column模型两个对象Q进行渲染ƈ选好W一行。不是太困难吧?如果一切顺利,搞掂之后你会看到像这LQ?
当然Q你可能对这D代码的某些l节Qƈ不完全掌握其中的含义Q像MemoryProxyI竟是什么?Q但先不要紧Q这个例子的目的是告诉你Q用量的代码,创徏一个富界面的多功能的UIlg而已——这是完全可能的Q更多细节的内容Q留l读者你自己学习吧。这儿有许多学习Grid的资源。Ext Grid教程、交叉Gird演示和Grid API文?
q只是冰׃角。还有一打的UI Widgets可以供调用,?layouts, tabs, menus, toolbars, dialogs, tree view{等。请参阅API文中范例演C?
在弄好一些页面后Q你已经懂得在页面和脚本之间的控制原理(interactQ。接下来Q你想知道的是,怎样与后台服务器Qremote serverQ交换数据,常见的是从数据库加蝲数据QloadQ或是保存数据(saveQ到数据库中。通过JavaScript异步无刷C换数据的q种方式Q就是所谓的Ajax。Ext内徏卓越的Ajax支持Q例如,一个普遍的用户操作是Q异步发送一些东西到服务器,然后QUI元素Ҏ回应QResponseQ作出更新。这是一个包含text input的表单,一个div用于昄消息Q注意,你可以在ExtStart.html中加入下列代码,但这必须要访问服务器Q:
<div id="msg" style="visibility: hidden"></div> Name: <input type="text" id="name" /><br /> <input type="button" id="oKButton" value="OK" />
接着Q我们加入这些处理交换数据的JavaScript代码到文件ExtStart.js?用下面的代码覆盖)Q?/p>
Ext.onReady(function(){ Ext.get('oKButton').on('click', function(){ var msg = Ext.get("msg"); msg.load({ url: [server url], //换成你的URL params: "name=" + Ext.get('name').dom.value, text: "Updating..." }); msg.show(); }); });
q种模式看v来已l比较熟悉了吧!先获取按钮元素,加入单击事g的监听。在事g处理器中Qevent handlerQ,我们使用一个负责处理Ajaxh、接受响应(ResponseQ和更新另一个元素的Ext内徏c,UCUpdateManager。UpdateManager可以直接使用Q或者和我们现在的做法一P通过Element的loadҎ来访问(本例中该元素?#8220;msg“的divQ。当使用Element.loadҎQ请求(request)会被加工处理后发送,{待服务器的响应QResponseQ,来自动替换元素的innerHTML。简单传入服务器url地址Q加上字W串参数Q便可以处理q个hQ本例中Q参数值来?#8220;name”元素的value),而text值就是请求发送时提示的文本,完毕后显C那个msg的divQ因为开始时默认隐藏Q。当Ӟ和大多数Extlg一PUpdateManager有许多的参数可选,不同的Ajaxh有不同的Ҏ。而这里仅演示最单的那种?/p>
最后一个关于Ajax的谜题就是,服务器实际处理请求和q回QResposneQ是具体q程。这个过E会是一个服务端面Q一个ServletQ一个Http处理器,一个WebService,甚至是Perl或CGI脚本Q即M一个服务器都可以处理httph。无法预料的是,服务器返回什么是服务器的事情Q无法给一个标准的例子来覆盖所有的可能性?q段代码输出刚才我们传入'name'的那个值到客户端,卛_送什么,q回什么)?/p>
使用Ajax的真正挑战,是需l过适当处理q的手工代码Qƈ相应格式化ؓ服务端可用接受的数据l构。有几种格式供h们选择Q最常用为JSON/XML)。正因Ext是一U与服务器中立的语言Q得其它特定语a的库亦可用于Ext处理Ajax服务。只要页面接受到l果是合适的数据格式QExtl不会过问服务器的事情!要全面讨个问题,已超出本文的范围。推荐正在用Ajax的您Q深入阅读Ext Ajax教程?/p>
本文转蝲Qhttp://extjs.com/tutorial/ext