一直感觉Ext在前台方面效果做的比较酷,最近想抽时间学习一下,应用到自己的项目中;下面是在学习各种Ext相关文档、博客以及论坛过程中汇总的一些知识点以及解惑。(如有侵权请留言)
概念:
(1)ExtJS是一个面向开发RIA也即富客户端的AJAX应用,是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。(以前是基于YAHOO-UI,现在已经完全独立了)
(2)之所以说是框架,因为它能够帮助我们在页面上快速而简单构建各种各样的控件,简化我们自己去写庞大js实现;它是一种纯面向对象的JS框架。扩展性相当的好,可以自己写扩展,自己定义命名空间,web应用可能感觉太大,不过您可以根据需要按需动态的加载您想要的类库就可以了,避免了网络传输流量问题。
(3)它提供了丰富的,非常漂亮的外观体验,成为众多界面层开发人员的追捧,更重要的是它核心的组件基本覆盖了我们构建富客户端的常用的组件以及各种功能,在统计方面做的也非常出色。
(4)在3.0的时候提供了类似与dwr的方式调用后台代码,交互更加简单;4.0版本又提出了MVC模式的开发,支持组件化、模块插拔化设计以及提供本地数据源的支持。
第一章 EXTJS的基本概念
1. 组件component : 能够以图形化形式呈现界面的类,其中还可以分为容器组件与元件组件。
- 容器组件:能够包含其它容器或者元件组件的类,其是进行单元化组件开发的基础
- 元件组件:能图形化形式表现一个片面功能的组件,其不仅在实现了原有传统WEB程序的现有组件,而且还扩展了许多实用的组件,如刻度器、日历、树形列表等。
2. 类
提供功能的非图形可形的类,它们为图形类提供了有力的支持
按其功能可分为:数据支持类(Data)、拖放支持类(DD)、布局支持类(layout)、本地状态存储支持类(state)、实用工具类(Util)。
密封类:不能被扩展的类
原型类:扩展了javascript标准类库中的类
3. 方法
作为类的功能体现,能够产生改变对象本身产生变化的直接因素
方法按访问形式可分为公有方法与私有方法。但由于javascript从原理上根本不支持这种结构,因此在EXTJS中,私有与公有方法完全凭借着用户自觉,没有像JAVA那样的强制性。
4. 事件
由类定义的,并且可以在类对象自身状态发生改变的触发。
只有被定阅的事件才会有效
如果不需要此事件,应该进行退定,增强程序的执行效率。
5. 配置选项
用以初始化一个EXTJS类对象的手段
注意,配置选项并不一定就是属性,总算是属性,也有可能出现属性返回的类型与你当初指定的配置选项类型不一致的情况。
6. 属性
能够在程序运行期间,能够被访问,用以了解当前类对象的状态。
在实际的编程中,EXTJS的属性设置,比较差劲,需要通过了解其源代码,才能了解各种实用属性的用处。
7. 命名空间
能够将编写好的EXTJS类进行有效组织的手段。
这个也是EXTJS能够称之为优秀AJAX框架的特征之一。
第二章 Ext4.0新特性以及常用数据处理功能
1. extjs4.0对原生javaScript功能进行了扩展(API中的Utilities模块中的NativeExtensions)
Utilities:常用的一些工具处理类
Native Extensions
Ext.Array
Ext.Number
Ext.Object
Ext.String
Ext.JSON
Ext.Date
Ext.Function
具体扩展了那些,请参照具体的API说明,扩展的原理eg:
- var Person = {name:'yfc',age:26};
-
-
-
- Object.prototype.getValue = function(key,defValue){
- if(this[key]){
- return this[key];
- }else{
- return defValue;
- }
- }
- alert(Person.getValue("email","[email protected]"));
-
2. 事件机制与新特性
(1)给对象加事件:
- Ext.get("元素ID").on("click",function(){
-
- });
(2)新特性:create与define(extend 、requires、config、mixins、alias以及statics)。
- create:在ExtJs4.0中你可以通过new方式也可以用create的方式得到一个对象的实例,在4.0版本中建议用create的方式来创建实例,这样ExtJS会对创建的实例进行统一管理。
-
- var win = Ext.create('Ext.window.Window',{
- width:400,
- height:300,
- title:'uspcat'
- });
-
- win.show();
- alias:别名的作用,可以把一个对象的内部函数暴漏处理啊,给其他对象直接调用。eg:
- var o = {
- say : function(){
- alert(11111);
- }
- }
-
-
-
- var fn = Ext.Function.alias(o,'say');
- fn();
-
- Ext.define('Bmsys.ml.Window', {
- extend:'Ext.window.Window',
- title: 'Window',
- closeAction: 'hide',
- width: 380,
- height: 300,
- resizable: false,
- modal: true,
-
- myTitile: 'myWindow',
- setTitle: function(){
- this.title = this.myTitle;
- }
-
-
- initComponent: function(){
- this.setTitle();
- this.callParent(arguments);
- }
- });
-
- var win = Ext.create('Bmsys.ml.Window',{
- titile: 'youWindow';
- }
- );
-
- win.show();
注意:属性只能在define时定义,不能通过win.myHeight = function(){...}添加属性。
- requires: JS的异步加载(按需加载),解决了网络js文件大而造成页面打开慢得问题,只有当成需要用到这个类时Ext才去到后台加载包含这个类的js文件;在这里就要,要求我们在写js类的时候要尽量的模块化,一个类就是一个js文件,而且类名与js文件名一致,命名空间定义规范。
-
- Ext.Loader.setConfig({
- enabled:true,
- paths:{
- myApp:'js/Bmsys/ml'
- }
- });
-
-
-
-
- var win = Ext.create('Bmsys.ml.Window',{
- titile: 'youWindow',
- requires: ['Bmsys.ml.Window']
- }
- ).show();
- config: 这个属性就是把你定义类的属性自动的加上get、set方法,省去自己去写的麻烦事。
- Ext.define('Bmsys.ml.Window', {
- extend:'Ext.window.Window',
- title: 'Window',
- width: 380,
- height: 300,
-
- myTitile: 'myWindow',
- config: {
- myHeight : 800
- }
- });
-
- var win = Ext.create('Bmsys.ml.Window',{});
-
- alert(win.getMyTitle());
- alert(win.getMyHeight());
-
-
- mixins:类的混合(多继承实现),因为我们在用define定义类的时候,extend只能继承一个类。为了拥有其它类定义好的方法及功能,我们可以通过类的混合来实现。
- Ext.define("say",{
- cansay:function(){
- alert("hello");
- }
- })
- Ext.define("sing",{
- sing:function(){
- alert("sing hello 123");
- }
- })
-
-
- Ext.define('user',{
- mixins :{
- say : 'say',
- sing: 'sing'
- }
- });
-
- var u = Ext.create("user",{});
- u.cansay();
- u.sing();
- static:类似java中静态,我们可以定义一些静态的属性以及方法,通过类名'.'的方式来访问。
- Ext.define('Computer', {
- statics: {
- factory: function(brand) {
-
- return new this(brand);
- }
- },
- constructor: function() { ... }
- });
-
- var dellComputer = Computer.factory('Dell');
3. 数据模型model(MVC中的M层)
数据模型对真实世界中对事物在系统中的抽象,extjs4.0中的mode相当于DB中的table 或 JAVA 中的Class。
(1)model的几种创建以及实例的方法。
-
-
- Ext.define("person",{
- extend:"Ext.data.Model",
- fields:[
- {name:'name',type:'auto'},
- {name:'age',type:'int'},
- {name:'email',type:'auto'}
- ]
- });
-
- Ext.regModel("user",{
- fields:[
- {name:'name',type:'auto'},
- {name:'age',type:'int'},
- {name:'email',type:'auto'}
- ]
- });
-
-
- var p = new person({
- name:'uspcat.com',
- age:26,
- email:'[email protected]'
- });
-
- var p1 = Ext.create("person",{
- name:'uspcat.com',
- age:26,
- email:'[email protected]'
- });
-
- var p2 = Ext.ModelMgr.create({
- name:'uspcat.com',
- age:26,
- email:'[email protected]'
- },'person');
- alert(p2.get('email'));
-
-
-
-
-
- alert(person.getName());
(2)model模型Validations以及通过修改原始类来实现自定义验证器。
-
- Ext.data.validations.lengthMessage = "错误的长度";
-
- Ext.onReady(function(){
-
- Ext.apply(Ext.data.validations,{
-
- age:function(config, value){
- var min = config.min;
- var max = config.max;
- if(min <= value && value<=max){
- return true;
- }else{
- this.ageMessage = this.ageMessage+"他的范围应该是["+min+"~"+max+"]";
- return false;
- }
- },
- ageMessage:'age数据出现的了错误'
- });
-
- Ext.define("person",{
- extend:"Ext.data.Model",
- fields:[
- {name:'name',type:'auto'},
- {name:'age',type:'int'},
- {name:'email',type:'auto'}
- ],
- validations:[
-
-
-
- {type:"length",field:"name",min:2,max:6},
- {type:'age',field:"age",min:0,max:150}
- ]
- });
- var p1 = Ext.create("person",{
- name:'uspcat.com',
- age:-26,
- email:'[email protected]'
- });
-
-
-
- var errors = p1.validate();
- var errorInfo = [];
- errors.each(function(v){
- errorInfo.push(v.field+" "+v.message);
- });
- alert(errorInfo.join("\n"));
- });
注意:自定义的校验器,你可以通过利用apply方法来为原始的类增加,也可以通过继承的方式实现。
(3)数据代理proxy:就是通过与后台的交互来完成数据模型,数据填充的服务类。
- Ext.define("person",{
- extend:"Ext.data.Model",
- fields:[
- {name:'name',type:'auto'},
- {name:'age',type:'int'},
- {name:'email',type:'auto'}
- ],
-
- proxy:{
- type:'ajax',
- url:'person.jsp'
- }
- });
- var p = Ext.ModelManager.getModel("person");
-
- p.load(1, {
- scope: this,
-
- success: function(record, operation) {
- alert(record.data.name)
- }
- });
(4)Molde的一对多和多对一关系。
-
- Ext.regModel("teacher",{
- fideld:[
- {name:'teacherId',type:"int"},
- {name:'name',type:"auto"}
- ],
-
- hasMany:{
-
- model: 'student',
- name : 'getStudent',
-
- filterProperty: 'teacher_Id'
- }
- });
-
- Ext.regModel("student",{
- fideld:[
- {name:'studentId',type:"int"},
- {name:'name',type:"auto"},
- {name:"teacher_Id",type:'int'}
- ]
- });
-
3. 数据代理Proxy
数据代理proxy是进行数据读写的主要途径,通过代理操作数据进行CRUD。
CRUD的 每一步操作都会得到唯一的Ext.data.Operation实例,它包含了所有的请求参数。通过构造Ext.data.Operation来传入请求参数。
(1)数据代理proxy目录结构
Ext.data.proxy.Proxy 代理类的根类(它分为客户端(Client)代理和服务器代理(Server))
A、Ext.data.proxy.Client 客户端代理
Ext.data.proxy.Memory 普通的内存代理。
Ext.data.proxy.WebStorage 浏览器客户端存储代理(cookie操作)。
Ext.data.proxy.SessionStorage 浏览器级别代理,浏览器关闭数据消失。
Ext.data.proxy.LocalStorage 本地化的级别代理,数据可以保存在浏览器文件里,浏览器关闭后,下次打开还在(不能夸浏览器)。
B、Ext.data.proxy.Server 服务器端代理
Ext.data.proxy.Ajax 异步加载的方式。
Ext.data.proxy.Rest 一种特使的Ajax。
Ext.data.proxy.JsonP 跨域交互的代理(请求的数据url不在同域内), 跨域是有严重的安全隐患的,extjs的跨域也是需要服务器端坐相应的配合。
Ext.data.proxy.Direct 命令.
4. 工作在Proxy下的读写器
(1)Reader : 主要用于将proxy数据代理读取的数据按照不同的规则进行解析,讲解析好的数据保存到Model中
结构图
Ext.data.reader.Reader 读取器的根类
Ext.data.reader.Json JSON格式的读取器
Ext.data.reader.Array 扩展JSON的Array读取器
Ext.data.reader.Xml XML格式的读取器
- var userData = {
-
-
-
-
- count:250,
- user:[{auditor:'yunfengcheng',info:{
- userID:'1',
- name:'uspcat.com',
- orders:[
- {id:'001',name:'pen'},
- {id:'002',name:'book'}
- ]
- }}]
- };
-
- Ext.regModel("user",{
- fields:[
- {name:'userID',type:'string'},
- {name:'name',type:'string'}
- ],
-
- hasMany: {model: 'order'}
- });
- Ext.regModel("order",{
- fields:[
- {name:'id',type:'string'},
- {name:'name',type:'string'}
- ],
-
- belongsTo: {type: 'belongsTo', model: 'user'}
- });
- var mproxy = Ext.create("Ext.data.proxy.Memory",{
- model:'user',
- data:userData,
-
- reader:{
- type:'json',
- root:'user',
- implicitIncludes:true,
- totalProperty:'count',
- record : 'info'
- }
- });
-
- mproxy.read(new Ext.data.Operation(),function(result){
- var datas = result.resultSet.records;
- alert(result.resultSet.total);
- Ext.Array.each(datas,function(model){
- alert(model.get('name'));
- });
- var user = result.resultSet.records[0];
- var orders = user.orders();
- orders.each(function(order){
- alert(order.get('name'))
- });
- })
(2)Writer :把前台的js对象数据按照不同的方式写到后台。
结构图
Ext.data.writer.Writer
Ext.data.writer.Json 对象被解释成JSON的形式传到后台
Ext.data.writer.Xml 对象被解释成XML的形式传到后台
- Ext.regModel("person",{
- fields:[
- 'name','age'
- ],
- proxy :{
- type:'ajax',
- url:'person.jsp',
- writer:{
-
- type:'xml'
- }
- }
- });
- Ext.ModelMgr.create({
- name:'uspcat.con',
- age:1
- },'person').save();
5. Store : 是一个存储数据对象Model的集合缓存,它可以为extjs中的可视化组建提供数据源 (GridPanel,ComboBox)等。(在ExtJS中占有重要的地位,它也属于Model层)
(1)类结构
Ext.data.AbstractStore
Ext.data.Store 没有特殊情况这个类就可以满日常的开发了
Ext.data.ArrayStore
Ext.data.DirectStore
Ext.data.ArrayStore 内置辅助的类
Ext.data.JsonStroe
内置辅助的类
Ext.data.TreeStore
(2)Ext.data.Store 使用
参数
autoLoad(Boolean/Object) : 自动加载数据,自动调用load
data(Array) : 内置数据对象的数组,初始化的是就要被装在
model(Model) : 数据集合相关的模型
fields(Field) :字段的集合,程序会自动生成对于的Model,这样我们就不需要再定义model。
方法
each( Function f, [Object scope] ) : void 变量数据中的Model
- Ext.define("person",{
- extend:'Ext.data.Model',
- fields:[
- {name:'name'},
- {name:'age'}
- ],
- proxy:{
- type:'memory'
- }
- })
- var s = new Ext.data.Store({
-
- data:[
- {name:'uspcat.com',age:1},
- {name:'yfc',age:26}
- ],
-
- fields:[
- {name:'name'},
- {name:'age'}
- ],
-
-
-
-
-
-
-
- });
- s.load(function(records, operation, success){
-
- Ext.Array.each(records,function(model){
- alert(model.get('name'));
- });
-
- s.filter('name',"yfc");
- s.each(function(model){
- alert(model.get('name'));
- });
-
- var index = s.find('name','yfc',0,false,true,false);
- alert(s.getAt(index));
- });
第三章 Ext事件机制、AJax以及Ext常用类
1. Ext事件机制
(1)事件的3中绑定方式
HTML/DHTML
DOM
EXTJS
(2)Ext.util.Observable 事件的基类
它为所有支持事件机制的extjs组建提供事件的支持。
如果我们自己创建新的组建需要有时间的支持那么我们就继承它。
事件的分类:
标准事件[键盘按钮按下,鼠标的单击双击,滑过滑动]。
业务事件[当面板收起的时候触发,当组建被销毁的时候触发,当每一个对象的属数值不为空的时候触发]。
(3)addManagedListener 收管制的监听
它是由调用的组建管理的,当组建执行了销毁命令的时候所有被组建管制的事件全部销毁。
(4)relayEvents 事件的分发和传播(控制实现事件在不同空间或对象内的传播)
比如说孩子喝完三鹿就去医院呀,老爸就要带着去医院
(5)事件对象Ext.EventObject
不是一个单例,不能被直接new出来,他会存活早事件处理的函数中
(6)事件管理器Ext.EventManager
它可以更方便的为页面元素绑定事件处理函数
方法:addListener 为元素增减事件
2. Ext中的Ajax是 Ext.data.Connection的一个子类,提供了用简单的方式进行Ajax的功能实现
(1)主要方法:
abort : 终止一个没有完成Ajax请求
isLoading : 判断指定的Ajax请求是不是正在运行
paresStatus : 返回请求响应的代码
request : 发送服务器请求
-
- var jsondata = "{id:'01',name:'uspcat.com','age':26,email:'[email protected]'}";
-
- var xmldata = "<user><name>mlmlml</name><age>19</age></user>";
-
- Ext.Ajax.request({
- url : 'person.jsp',
- method : 'POST',
- timeout :3000,
-
-
- params:{id:'01'},
-
-
- form:"myform",
-
-
- jsonData:jsondata,
- xmlData:xmldata,
-
-
- success :function(response , options){
- alert(eval(response.responseText)[0].name);
- },
- failure :function(response , options){
- alert(response.responseText+" "+options)
- }
- });
(2)Ext.ElementLoader:方便我们重新构建页面
load方法
startAutoRefresh 方法
-
-
-
- var time = Ext.get("time").getLoader();
-
-
- time.load({
- url:'/extjs/extjs!getTime.action',
- renderer:function(loader,response,request){
- var time = response.responseText;
- Ext.getDom("time").value = time;
- }
- });
-
- i.startAutoRefresh(1000,{
- url:'/extjs/extjs!getI.action',
- renderer:function(loader,response,request){
- var i = response.responseText;
- Ext.getDom("i").value = i;
- }
- });
3. Ext以及core包下面的Domhelper、Element类。
(1)Ext.core.Element
API解释
他是组建和控件的基础
他对一个DOM对象的封装(Document Object Model)
a、如何得到Element
Ext.core.Element.fly(String/HTMLElement el, [String named] ) : Element
Ext.get(Mixed el) : Element
b、Element 相关方法
addClsOnClick( String className ) : Ext.core.Element。
addClsOnOver( String className ) : Ext.core.Element。
addKeyMap( Object config ) : Ext.util.KeyMap。
addKeyListener( Number/Array/Object/String key, Function fn, [Object scope] ) : Ext.util.KeyMap。
appendChild( String/HTMLElement/Array/Element/CompositeElement el ) : Ext.core.Element
createChild( Object config, [HTMLElement insertBefore], [Boolean returnDom] ) : Ext.core.Element。
(2)Ext.core.DomHelper
API解释
他可以很容易的操作页面的HTML.和DOM元素
append( Mixed el, Object/String o, [Boolean returnElement] ) : HTMLElement/Ext.core.Element--------追加一个孩子。
applyStyles---为元素添加样式 eg:Ext.core.DomHelper.applyStyles(Ext.get("p1"),"color:red");
//下面两个是被当做兄弟追加的
insertAfter( Mixed el, Object o, [Boolean returnElement] ) :
insertBefore( Mixed el, Object/String o, [Boolean returnElement] ) :
//创建dom结构,通过给的标签字符串
createDom( Object/String o ) : HTMLElement
eg:var html = Ext.core.DomHelper.createDom("<h1>hello</h1>");
(3)Ext
//方法是执行在文件加载完之后
onReady( Function fn, Object scope, Boolean withDomReady, Object options ) : void
get()//不在多说
query( String path, [Node root] ) : Array
http://www.w3school.com.cn/xpath/xpath_axes.asp
语法看 Ext.DomQuery
getCmp( String id ) : void---返回组建管理器管理的ID组件
isEmpty( Mixed value, [Boolean allowEmptyString] ) : Boolean
namespace( String namespace1, String namespace2, String etc ) : Object
each( Array/NodeList/Mixed iterable, Function fn, Object scope, Boolean reverse ) : Boolean
apply( Object object, Object config, Object defaults ) : Object
encode( Mixed o ) : String
select( String/Array selector, [Boolean unique], [HTMLElement/String root] )
typeOf( Mixed value ) :判断参数是一个什么样的类型,返回的是字符串,eg:string、function
-
- var div01 = Ext.core.Element.fly("div01");
-
- div01.addClsOnOver("divC");
-
- var input01 = Ext.get("input01");
-
- var fn1 = function(){
- alert("单击B按钮调用这个函数")
- }
-
-
- input01.addKeyMap({key:Ext.EventObject.B,ctrl:false,fn:fn1,scope:input01});
-
-
-
-
- input01.addKeyListener({key:Ext.EventObject.X,ctrl:true},function(){
- alert("单击ctrl+x")
- },input01);
-
- function createChild(){
- var el = document.createElement("h5");
- el.appendChild(document.createTextNode("我是被追加的"));
- return el;
- }
- Ext.get("div02").appendChild(createChild());
-
- Ext.getBody().createChild({
- tag:'li',
- id:'item1',
- html:'我是第一个个节点'
- });
3. ExtJS4.0中util包里面的一些工具类用法。
(1).Ext.util.CSS
Ext.util.CSS.createStyleSheet(".c{color:red}","red");
创建一个样式表,类似于你在css文件里面定义的内容。
Ext.get("d1").addClsOnOver("c");
在鼠标滑过时,动态的给某个元素对象的class赋值为刚刚定义的名为c样式表。
Ext.util.CSS.getRule(".c",true);
获得当前的样式的对象,可以从这个对象获得一些你需要的参数。
Ext.util.CSS.swapStyleSheet("sheet1","1.css");第一个参数是当前引用样式的ID,第二个是也是的URL路劲
动态的切换,你所引用的样式表。(即假如你还有一个样式表2.css,里面1.css定义的样式名称一样,这时你可以用这个函数Ext.util.CSS.swapStyleSheet("sheet2","2.css")把目前引用1.css切换成2.css。)
一般用于不同风格的样式切换。
注意ID唯一。
Ext.util.CSS.removeStyleSheet("red");
移除当前,页面已经定义了的样式,传入样式的ID即可。
Ext.util.CSS.updateRule(".c","color","#990055");
更新某个已经定义了样式中的某个属性的值。
(2).Ext.util.ClickRepeater click的转发器是Ext.util.Observable的子类
- Ext.onReady(function(){
-
- var cl = new Ext.util.ClickRepeater(Ext.get("b4"),{
- delay:3000,
- interval:4000,
- stopDefault:true,
- handler:function(){
- alert("单击我");
- }
- });
-
-
- })
(3).Ext.util.DelayedTask 代替setTimeout
(4).Ext.util.Format 格式化的公共类
用于一些字符串常用操作、日期以及小数的格式化等。
(5).Ext.util.MixedCollection 集合类
强大之处在于它同时可以存放各工种各样的对象。并且提供很多操作集合里对象的方法。
(6).Ext.util.TaskRunner 模拟线程控制
模拟多线程的实现。
- Ext.onReady(function(){
- var runner = new Ext.util.TaskRunner();
- var task = {
- run:function(){
- Ext.getDom("t1").value = Ext.util.Format.date(new Date(),"Y-m-d-s");
- },
- interval:1000
- }
- runner.start(task);
- Ext.get("b6").on("click",function(){
-
- runner.stop(task);
- })
- })