论坛首页 Web前端技术论坛

EXTJS项目实战经验总结一:日期组件的change事件

浏览 6754 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-28  

需求说明:

        

   1  依据选择的日期,加载相应的列表数据,如图:

     

 

开发说明

   1 开发思路: 在日期值变化的事件中获得选择后的日期值,传给后台,然后从后台加载相应的数据

 

    2 问题:在查看extjs2.2 的api的官方说明文档,文档对datefield组件的change事件说明如下:

       change : ( Ext.form.Field this, Mixed newValue, Mixed oldValue )
       Fires just before the field blurs if the field value has changed.

       这句话是说值发生变化,并且在失去焦点之前触发此事件,也就是说如果此日期组件的值发生变化,而焦点并没有失去,这个事件也就不会触发。通过我们的程序验证,事实也的确如此。我们需要值发生变化就要触发相应的事件。

    3 解决方法:

       从源头找事件:是用户点击相应的日期,才导致文本框里的值发生变换。可以捕获这个点击选择事件,通过这个事件我们得到日期值,传给后台,加载列表数据

    4 具体做法:

       继承Ext.form.DateField,覆盖menuListeners这个私有监听器属性,封装类如下:

     

Ext.form.CustomDateField = Ext.extend(Ext.form.DateField,  {
    // private
    readOnly: true,
    setValueFn:null,
    menuListeners : {
        select: function(m, d){
            this.setValue(d);
            if(this.setValueFn)
               this.setValueFn.call(this,this.formatDate(this.parseDate(d)));
        },
        show : function(){
            this.onFocus();
        },
        hide : function(){
            this.focus.defer(10, this);
            var ml = this.menuListeners;
            this.menu.un("select", ml.select,  this);
            this.menu.un("show", ml.show,  this);
            this.menu.un("hide", ml.hide,  this);
        }
    }
});
Ext.reg('customDateField', Ext.form.CustomDateField);

 

 

 

      5 使用这个自定义的组件:

        

        例:

    

{
				fieldLabel : '计划开始日期',
				vtype : 'isBlank',
				xtype : 'datefield',
				xtype : 'customDateField',
				setValueFn:function(value){
					alert(value);
				},
				format : 'Y-m-d'
			}

 

 

  这种方法不好的地方,就是覆盖了extjs提供的私有属性menuListeners,不知路过的朋友,有没有比较好的解决办法

 

 

   

 

 

 

 

 

     

                

             

  • 大小: 49.5 KB
  • 大小: 12 KB
   发表时间:2008-12-03  
可以监听关闭事件的吧?
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics