• [转载]EXTJS学习


    原文地址:EXTJS学习作者:心语心鱼

    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' ,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("提示信息","只能够输入数字");},
    =====


    # new Ext.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:new Ext.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();
           }}
    });


  • 相关阅读:
    有7g和2g的砝码各一个,怎样称可以3次把140g东西分为50g和90g???????
    中缀到后缀(一个例子)
    动态代理模式的使用
    代理模式用来初始化的延迟下载
    ReentrantLock Condition 实现消费者生产者问题
    Two Sum
    [leetcode]重建二叉树(先序和终须) 中序遍和后续
    (转载)旋转数组查找 最简洁方法 总结
    [不明觉厉] 下一个排列
    codeforces -- 283A
  • 原文地址:https://www.cnblogs.com/liuzhuqing/p/7480281.html
Copyright © 2020-2023  润新知