extjs4 笔记

关于手册导航中图标的说明:

蓝色-普通类

紫红-单例类

黑色-组件类

--还有一种是包

 

viewport一个应用只能有一个,否则EXT会抽风...

 

ComponentQuery  的query中不要以viewport开始.

 

Component 要可拖动,需要设置position:abrolute

 

 

application 作为一个应用的开始文件

 

requires 是Ext.classs上的属性

定义一个类的时候使用singleton 将得到该类的实例,并与静态方式使用该实例 如 Ext.Message.Alert();

 

 

应用中用到的模型,视图,需要在controller中注册才能使用,包括application中要使用都需要在controller中注册

配置自定义后才能用set跟get方法获取,

当别名为widget.开始的为全局试图别名,可以直接使用

mixins方法是在CLASS上的,所以几乎所有的EXT对象都具有相互混合的能力(就是一个对象的方法给另一个对象使用) ,且混合时使用的key好象没啥作用的

在运行application 之前创建一个对象,ext都会根据对象名去尝试加载它,所以在application中运行前定义定义类之后运行是不行的(指同个文件中)

model是数据规格

store是数据集

model store 都可以接受数据代理proxy

store有data,当有data的时候代理将被忽略,data将用于自动创建内存代理,store的代理或data得到的数据将用于model列表的创建
除model外其他

内存代理一般开启自动加载,而其他代理一般最后手动调用,

field 是字段对象,附属于model与存在,但store也有该属性,但strore的该字段是用于自动创建model用的,所以field也是用于model的

           

 

从上图可以看出model与store的关系.两者之间可以说通过代理类来链接

而代理分为读写代理,store就是拿porxy来得到数据,并组装一堆model出来

当model也有代理.是用于获取一个数据的, 或对一个数据进行操作的,因为model有save,load等方法

         

Ext.grid.Panel

分页的每页数量在store的pageSize控制

对于数据的加载解析

在proxy里配置,即Ext.data.reader.Reader

           

totalProperty 总数的key

           

successProperty 成功的字符串

root 数据的key

           

 application 的配置

在application中,launch是请求并初始化完控制器后运行的函数,这里通常是对试图渲染输出,但也可以通过设置

autoCreateViewport为true来自动去请求view/Viewport.js来完成视图的输出,当你使用大于4.05版本的Extjs的时候,不在需要手动设置requires了

 controller的作用为请求必要的model,store,view等,并在control中对试图进行动作监听等.在controller初始化的时候也可以做些准备操作

 如果在control外还需要些事件监听,可以使用this.application.on()来增加

如果你希望在controller在运行后处理东东,你可以使用onLaunch来处理,

对于controller的控制为,先对版面进行区分划分,然后对每个区块建立一个controller

           

对于panel中的dockedItems,需要明确指出工具条的类型,如果想简化,需要使用tbar,tbar...等

           

元素查找:

1.组件跟元素都有up,down分别对应向上跟向下查找元素,支持CSS规则

2.对于全局查找,则可以用Ext.fly Ext.get Ext.getCmp

及支持CSS规则查找的Ext.query (此方法加第二个参数跟1一样)及用于组件的Ext.ComponentQuery.query();

3.视图创建,new 或 Ext.create 都可以创建,但如果alias被命名为widget.xxx后,可以使用Ext.widget('xx')获得,但是用widget的前提还必须是视图已经被引入,且可以直接使用在全局的xtype上在Ext4.05之后,在controller中添加依赖之后会自动加载,所以在controller中添加依赖后可以直接使用.默认系统组件的alias的名称为widget.xtype,所以系统组件都可以使用widget取出.当声明为别名为widget. 时要防止相互覆盖,且后面声明的会覆盖前声明的,例如声明一个组件的alias为widget.panel,将导致{xtype:"panel"}这样写法生成出来的都是你定义的那个组件,因为xtype使用的是全局组件.但Ext.create('Ext.panel.Panel') 不受影响

         

           

动态操作组件

先来段代码:

var sl = Ext.widget('window', {

    width : 300,

    height : 200

});

var t = new Ext.Template([ '<div name="{id}">',

        '<span class="{cls}">{name:trim} {value:ellipsis(10)}</span>',

        '</div>', ]);

t.compile();

sl.show();

t.append(sl.body, {

    id : 'myid',

    cls : 'myclass',

    name : 'foo',

    value : 'bar'

});

一个已经存在的window中增加一个渲染好的模板字符(不明白为什么文档里没有说有body属性)

如果添加组件就更简单了,直接使用add把创建的组件添加进去即可

删除:组件有个remove,元素也有个remove,其他参照文档,component的removieall是删除所有的组件.不包括元素

           

错误:

           

1.namespace is undefined

出现这个错一般是有xtype(声明为全局组件的组件) 没找到报的错误

2.使用application的时候如果声明的视图或其他的extjs类的文件错误,extjs不会报错,即加载完毕之后没啥反应.此时可以检查定义的类名与app定义的名字是否一直

即: application的name 跟定义的类名是否一致 如 name:"UP" 定义类名需要为UP.view.pritem

让panel可拖动,配置为:

draggable:{

   onDrag : function(e){

        var pel = this.proxy.getEl();

        this.x = pel.getLeft(true);

        this.y = pel.getTop(true);

     },

      endDrag : function(e){

         this.panel.setPosition(this.x, this.y);

     }

}     

工具条:

工具条包下的 Fill Item Separator Spacer TextItem 都为辅助工具条格式的组件

工具条可以添加其他组件,比如button,pannel等,当然button最为常用

 button有menu属性,用于添加菜单,对于菜单,ColorPicker,DatePicker跟Menu为同一级

 Menu有CheckItem,Item(默认),Separator 菜单可用,而CheckItem可以这group来变为单选

菜单使用Ext.menu.MenuMgr 统一管理 ,对于菜单显示,如果不是绑定到一个工具条上,可以使用组件类上的showAt()方法来显示,接受getXY返回值作为参数

       

关于布局

Ext.create('Ext.panel.Panel',{

layout:'fit',//或{type:'vbox',align:'center'}

title:'this is title'

})

layout 参数可以为:

fit 单个视图

border 边框,中间那个视图必须

anchor 横向布局

absolut 绝对定位布局 继承与anchor

from 表单布局 (表单默认布局方式)

column 竖向布局 Ext.grid.Panel 用到

对于以上的横向跟竖向布局的不足,可以使用以下代替

hbox 横向布局 vbox 竖向布局 使用最好指明对其方式 示例:{type:'vbox',align:'center'}

     

关于表单验证

对于表单验证,每个field有个vtype属性,默认系统支持的email alpha url alphanum

自定义验证的方法如下

Ext.form.field.VTypes.emailText="据说你的邮箱是错误的...";//重新定义错误信息

var timeTest = /^([1-9]|1[0-9]):([0-5][0-9])(\s[a|p]m)$/i;

Ext.apply(Ext.form.field.VTypes, {

// vtype validation function

time: function(val, field) {

return timeTest.test(val);

},

// vtype Text property: The error text to display when the validation function returns false

timeText: '顶个肺啊,错了~".',

// vtype Mask property: The keystroke filter mask

timeMask: /[\d\s:amp]/i

});

定义好了之后就可以使用了,上述定义中的vtype是time 需要在使用前定义好vtype,如果vtype没有定义直接使用会报错的..可以直接定义在使用的前面

除了vtype验证,field本身就带了好几种验证且每个对应的消息体均可自定义(有点麻烦…)

示例:

{

    xtype : 'datefield',

    fieldLabel : '选择时间',

    name : 'aaa',

    allowBlank : false,//验证

    blankText:"此字段必填",//验证消息

}

其他的翻阅下手册.

   

关于表单使用

使用都很简单,formPanel里取得表单有getForm()方法

有个表单组件涉及到store,官方示例如下

var states = Ext.create('Ext.data.Store', {

fields: ['abbr', 'name'],

data : [

{"abbr":"AL", "name":"Alabama"},

{"abbr":"AK", "name":"Alaska"},

{"abbr":"AZ", "name":"Arizona"}

//...

]

});

// Create the combo box, attached to the states data store

Ext.create('Ext.form.ComboBox', {

fieldLabel: 'Choose State',

store: states,

queryMode: 'local',//类似于load 有local remote 用于获取远端的数据时候用到

displayField: 'name',

valueField: 'abbr',

renderTo: Ext.getBody()

});

 

关于事件监听

基本上所有的类都有实现Observable,所以很多类有有listeners 属性 具体的事件每个类各有不同

listeners:{

    render:function(){

        alert("ddd");

    },

    dblclick: {

        element: 'body', //bind to the underlying body property on the panel

        fn: function(){ console.log('dblclick body'); }

    }

},

因为在create的时候panel的initComponent 方法是不能使用的,所以想在初始化的时候操作些东西监听事件是不错替代方案

在controller中也有个control 方法,示例如下

init: function() {

     this.control({

'viewport .userlist': {

     itemdblclick: this.onPanelRendered

},

'viewport .slider':{

     changecomplete:this.mytest

}

});

},

 

store中如果存在data,且定义为ajax或其他, autoLoad 将失效

 

使用application时,当store的storeId会被覆盖为该store名,所以定义无效.

Ext.define('Index.store.User', {
    extend: 'Ext.data.Store',
    model:'Index.model.User',
    storeId:'simpsonsStore',//该定义无效,覆盖为User
   ***
});

 

 

 

posted @ 2011-11-08 00:18  liushan  阅读(2278)  评论(0编辑  收藏  举报