​​​​作者:​心语心鱼​

ExtJs  Base:

------------------------------------------------------------------------------

1. get 、 fly、 getCmp 、getBody 、getDoc 、getDom、、

  get-----ExtJs获取节点、dom、提供缓存机制  Ext.Element类是Ext对DOM的封装  get是Ext.Element.get的简写

  fly-----

  getCmp----用来获得一个Ext组件,已经在页面中初始化了的Component或其子类的对象,getCmp方法其实是Ext.ComponentMgr.get方法的简写

  ...

2. Ext.extend 继承

LoginWindow=Ext.extend(Ext.Window,{

  initComponent : function(){

       LoginWindow.superclass.initComponent.call(this);

  }

});

LoginForm=Ext.extend(Ext.form.FormPanel,{

  constructor:function(_cfg){

  if(_cfg==null){ _cfg={}; }

  Ext.apply(this, _cfg);

  LoginForm.superclass.constructor.call(this, {    ....   });

 });

3.ExtJs事件模型

       Ext.util.Observable   事件抽象基类

       Ext.EventObject       处理按键

       Ext.EventManager

       Ext.lib.Event

 4.Panel面板   mixed混合型

    1..tools[ {  },{}.... ]   标题栏添加按钮

    2..面板 显示/隐藏  show() / hide()

    3..面板的拖拽---------------------------------


         draggable: {

               insertProxy: false,


               onDrag : function(e){

                   var pel = this.proxy.getEl();


                   this.x = pel.getX();

                   this.y = pel.getY();


                   var s = this.panel.getEl().shadow;

                   if (s) {

                       s.realign(this.x, this.y, pel.getWidth(), pel.getHeight());

                   }

               },


               endDrag : function(e){


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

               }

           },

5..tabPanel 标签面板

    1...动态创建 标签面板

    2...关闭标签面板

    var tab = tabPanel.getComponent(o);

    tabPanel.remove(tab);

    if(p.closable)  closeTab(p);

    3..标签面板 注册右键菜单


6...Ext.Window

   modal:true,最好配置下  shadow:true ,解决 窗口 跟 阴影 同步变化

-------------------------------------

7..Ext.grid 表格

    高级store:

    simpleStore = Store + MemoryProxy + ArrayReader

    JsonStore  =  Store + HttpProxy + JsonReader

    Ext.data.GroupingStore对数据进行分组

ColumnModel([{},{}...]) 是一个数组

     header      显示文本

     dataIndex   记录集字段

     sortable    排序

     renderer    列渲染方法

     width       宽

     format      格式化

    修改某一行样式:grid.getView().addRowClass(r, css) 或 grid.getView().getRow(r).style.backgroundColor='red'

    修改某一行的单元格样式:grid.getView().getCell(r,c).addRowClass(css)

    获得某一行数据:store.getAt(1)

    刷新:grid.view.refresh()

    获取某一行字段:grid.getStore().getAt(i).get('username')

   1...grid列宽问题:

  如果GridPanel 配置viewConfig: {forceFit:true}, 则 ColumnModel按照 width比例分配宽度

     var cm = new Ext.grid.ColumnModel([{ header:'编号',   dataIndex:'id' ,width:3}]);

  var grid = new Ext.grid.GridPanel({ viewConfig: {forceFit:true}});


 可以指定 每列的宽度数值,若同时指定了viewConfig {forceFit:true}   则指定的数值无效,grid会根据这些数值计算出比例,对各列分配宽度。

 autoExpandColumn 只能指定一列的 id ,则该列渲染时会自动延伸,撑起表格、

 2...grid 列时间处理

    推荐返回 java 的 getTime 整数 ,在 js renderer : 用 Date 格式出字符串

 3...grid 单元格格式化

    指定列元数据的 renderer 函数 ,返回 带格式的 html

 4...grid 行设定颜色

    指定 viewConfig.getRowClass 返回相应的的行css

 5.自动显示行号

    列元数据的第一个数据填充 new Ext.grid.RowNumber() ,会自动计数 ,计数中断后,可以用 gridView.refresh()重新计数。

 6...grid 后台排序

    设置 store.remoteSort = true ,会向后台提交两个参数 sort , dir

 7...editorgrid

    store.modified 所有修改过的记录 ,commit() 会去除 单元绿色标记

 8...groupgrid

     groupstore 关键要设置 groupField

 9.表格右键实现要点

    监控 contextmenu 事件,自己构造 menu组件 ,弹出在鼠标位置

 10...formpanel layout

      只能是 form ,不能改 ,formpanel 只负责布局 ,核心部分由 form成员 处理

 11...anchor

     用来指定 输入组件 和 formpanel 的相对宽度 高度。

 12...submit

       默认 ajax 提交 ,传统方式 要 获得 dom节点 ,调用 传统submit()

 13...使用后台校验

      关键是 设置 返回 json sucess:false ,errors:{输入组件名:该组件的错误}

 14...嵌入其他html

     可以设置 xtype:'panel',html: 随便

 15...comboBox hiddenName

     真正value存放的位置,涉及提交,建议设置

     getValue 返回真正value

     getRawValue 返回显示的text

 16...comboBox  triggerAction

     防止重新选择 显示不全 ,建议设成 'all'

 17...comboBox radio

      区别主要在于 radio 多个要设同一个 name

 18...树的后台生成数据

     设 treeloader 的同时 要设置 AsyncTreeNode ,后台会收到 当前树节点的 id

 19...expand

     root.expand() 只会扩展一层 expand(true) 则全部扩展了

 20...节点的默认图片

     icon : 图片地址  优先级高

     iconCls :图片css

 21...节点提示信息

    设置 qtip

 22...节点的界面修改部分

    用tree.ui 来修改 ,mvc分层了

8...Ext.grid.GroupingGrid

  var store = new Ext.data.GroupingStore({

      autoLoad : true,

      groupField:'department',

      sortInfo:{field:'id',direction:'ASC'}, 

      proxy:  new Ext.data.MemoryProxy(datas),

      reader: new Ext.data.ArrayReader({idIndex: 0},[ {name:'id'}]

  });

grid = new Ext.grid.GridPanel({ view : new Ext.grid.GroupingView(),... });


======================

= extjs 常用布局

======================

1.. FitLayout

-------------

FitLayout:自动适应布局,只能使用一个子组件,无法胜任复杂布局;

注意:子组件 使用autoHeight会使Fitlayout失效

1..BorderLayout

----------------

边框布局:分5个区域-东 西 南 北中,中是不能省略的;

在某一区域添加split:true,左右,上下拖放,而中不会变化;

collapsible:true激活折叠功能

问题:如何在 西区域 的标题栏 添加额外的功能呢?在折叠位置再添加一些按钮?

























--------------------------------------------------

使用 extjs 模板创建 dom:

  var bd = Ext.getDom('checkCode');

  var bd2 = Ext.get(bd.parentNode);

  bd2.createChild([{tag:'span',html:'   '},{tag: 'img',id:'randImage',onclick:'loadimage()', src: '/demos/WindowDemo/image.jsp',align:'absbottom'}]);

-----------------

checkbox

boxLabel :String   ==The text that appears beside the checkbox

inputValue : String

////////////////////////////////////////////////////

 //applyTo是直接使用指定元素来生成组件

 //renderTo是在指定容器内部生成组件(该元素被用作容器)

  //Ext.QuickTips.init();

  //Ext.form.Field.prototype.msgTarget = 'side';

  //qtip  当鼠标移动到控件上面时显示提示

  //title  在浏览器的标题显示,但是测试结果是和qtip一样的

  //under  在控件的底下显示错误提示

  //side  在控件右边显示一个错误图标,鼠标指向图标时显示错误提示

  // [element id] 错误提示显示在指定id的HTML元件中

//表单验证extjs默认几种

alpha 只输入英文字母

alphanum  只能输入字母 和 数字

email   电子邮件

url     网址

-----------------------------

{

   id:'userName',

   name : 'userName',

   fieldLabel : '帐号',

   vtype:"email",  //email格式验证

   vtypeText:"不是有效的邮箱地址",//错误提示信息

   blankText : '帐号不能为空'

}

------------------------------

minValue 和 maxValue  输入数字范围

allowDecimals  不能输入小数点

allowNegative 不能输入负数

=====

regex:/^d$/,//正则表达式 这里假设只允许输入数字 如果输入的不是数字 就会出现下面定义的提示信息

 regexText:"regexText:只能够输入数字", //定义不符合正则表达式的提示信息

 validateOnBlur:true,//默认是true,失去焦点时验证

  validationDelay:300,//默认是250,验证延迟时间,毫秒数

 validationEvent:"click",//验证事件 默认是keyup 可以是String/Boolean

 //自定义的验证函数 当输入的数据不符合正则表达式的要求时,就会执行这个函数

 validator:function(){Ext.Msg.alert("提示信息","只能够输入数字");},

=====

# newExt.form.NumberField({

#    style:'direction:rtl'//这样就可以让输入框的光标定位在右边了.这就是你要的效果:)

# });

//正则表达式验证在EXTJS中的应用

regex:/^[a-zA-Z0-9_u4e00-u9fa5]+$/,

regexText:'格式应由汉字、数字、字母或下划线组成.'


 文本框

maxLength: 5,//验证最大输入字符数

maxLengthText:"长度不多于5个字符!",

//minLength: 2,  //验证最小输入字符数

// minLengthText:"评论人长度不少于2个字符!",

-------------------------------

使用正则表达式验证

regex :/[u4e00-u9fa5]/,   //正则表达式 [u4e00-u9fa5] : 只能输入中文

高级自定义密码验证:

//先用Ext.apply方法添加自定义的password验证函数(也可以取其他的名字)

Ext.apply(Ext.form.VTypes,{

   //val指这里的文本框值,field指这个文本框组件

   //confirmTo是我们自定义的配置参数,一般用来保存另外的组件的id值

   password:function(val,field){

     if(field.confirmTo){

         //取得confirmTo的那个id的值

         var pwd=Ext.get(field.confirmTo);

         return (val==pwd.getValue());

     }

     return true;

   }

});

------------

items:[{

   fieldLabel:"密码",

   id:"pass1",

    },{

   fieldLabel:"确认密码",

   id:"pass2",

   vtype:"password",//自定义的验证类型

   vtypeText:"两次密码不一致!",

   confirmTo:"pass1",//要比较的另外一个的组件的id

}


-------------------------------------------------------------------

  draggable:true,是否允许拖动

  constrain:true,限制窗口的整体

 constrainHeader:true, 窗口的顶部不能超越浏览器边界

  plain:true,  //渲染窗口的背景颜色

 resizable:false,   //鼠标是否可以任意拖动窗口的大小

  border:true,      //窗口内的边框

 minimizable:true,  //是否有最小化按钮

 maximizable:true,  //是否有max 按钮

  loadMask:"正在加载......",

 closable:true,     //是否有close 按钮

 closeAction:'close', //点击关闭 触法closeAction  hide:是将window隐藏,

 "close",关闭window就将它从内存中撤销

Ext.window的closeAction有两种选择close/hide(完全关闭/隐藏)

close就是把此window destroy (默认)如果使用默认,点击关闭窗口就把窗口对象销毁

这样就不能使用show()

closeAction:'hide'


5.如果需要定义控件有两种方法(以gridPanel为例子)

A:newExt.grid.GridPanel({

})

B:{

      xtype:’gridpanel’,

}

使用new 的方式是立即创建组件 而使用xtype则是延迟创建这样的好处是当需要渲染此组件时才创建

类似hibernate的延迟加载都是为了提高效率!

6.在JS中把JSON字符串转为对象,Ext.decode ( )

  在JS中把对象转为JSON字符串,Ext.encode ( )

7.可以在容器组件中把hideLabels设置为true,这样将不会显示容器中字段的标签了

8.年龄随着出生日期改变

{

   xtype:"datefield",

   format:"Y-m-d",      //格式化日期,默认:'m/d/Y'

   value:"1981-10-15",

   readOnly:true,       //设为只读

   fieldLabel:"出生日期",

   listeners:{

       "blur":function(_df){  //监听失去焦点事件,年龄随着出生日期改变

           var _age = _df.ownerCt.findByType("textfield")[1];

           _age.setValue(new Date().getFullYear() - _df.getValue().getFullYear() + 1);

       }

   }

}

-----------------------------------------------

第一种handler:

//document.body == Ext.getBody().dom

Ext.onReady(function(){

   new Ext.Button({

       renderTo:Ext.getBody(),//属性renderTo:将当前对象所生成的HTML对象存放到指定的对象中

       text:"确 定",

       handler:function(){    //函数handler:指定一个函数句柄,默认触发click事件

           Ext.Msg.alert("提示","欢迎学习ExtJS。");

//           alert("欢迎学习ExtJS。");

       }

   });

});

第二种listeners:

Ext.onReady(function(){

   new Ext.Button({

       renderTo:Ext.getBody(),

       text:"确 定",

       listeners:{  //函数listeners:在对象初始化之前就将一系列事件进行定义

           "click":function(){

               Ext.Msg.alert("提示","欢迎学习ExtJS。");

           }

       }

   });

});

第三种on:

Ext.onReady(function(){

   var _btn = new Ext.Button({

       renderTo:Ext.getBody(),

       text:"确 定"

   });

   _btn.on("click",function(){

       Ext.Msg.alert("提示","欢迎学习ExtJS。");

   });

});

====================================================

《》从gridpanel中获取一行数据填充到表单中

  grid.on('click',function(){

  var selections =grid.getSelectionModel().getSelections();

   for(var i = 0;i <selections.length ; i++){

      var record = selections[i];

        formPanel.getForm().loadRecord(record);

        winP.show();

      }}

});