`

解决Ext2.0中ComboBox执行Filter第一次无效的问题

    博客分类:
  • ext
阅读更多
原文出处:http://www.cnitblog.com/yemoo/archive/2009/07/28/44724.html
更新Ext ComboBox的列表项,直接通过更新其Store即可,而且可以通过Filter对store数据进行过滤只显示符合特定条件的列表项。
今天项目正好需要这个了,页面4个ComboBox的列表随着页面操作需要不断更新,我采用的方法也正是filter,本来以为一个很简单的问题,但整整郁闷了我两个多小时,开始发现filter之后虽然store的内容已经发生了变化,但ComboBox的列表项却仍然是原来的,偶以为是自己程序那个地方出错了,结果查了半天也没有找到什么错误。

后来测试突然发现只是第一次点击显示ComboBox的时候没有显示过滤后的内容,而从第二次开始每次都能获显示flter后的内容。
这个问题真是怪了,我猜想应该是EXT本身的问题,开始只是想触发一个expand事件,但发现问题并不那么简单,花费半个小时也没有想到好的办法,只好到Ext Forum上求助了,先search了一下ComboBox Filter,发现了已经有很多人遇到了与我同样的问题,看来真的是Ext的问题了,看了几篇帖子,找到了一个比较有效的解决办法:filter之后删除原store的数据快照。
如:

store.filter();
delete store.snapshot;
马上试了一下还真可以,兴奋了半天之后却又遇到了另一个问题,即store.clearFilter不能还原到原来的数据了。思考了一下应该是store.snapshot保存了最原始的数据,这样一delete肯定就找不到原始数据了,因此也就不能恢复了。这可够郁闷,删也不是不删也不是!
继续思考,如果我把它的snapshot保存起来,需要用clearFilter恢复数据时再把它的snapshot给还原了岂不就解决了吗?经过测试,果真成功!

为了使用方便、降低重复代码量,偶对comboBox进行了简单的封装,除了解决上面filter的问题,还实现了通过document.forms[0].combox.value获取和设定comboBox的功能,通过选择ComboBox的列表值会同步更新form表单中combox的值。

使用方法示例:

html:
<form name="testFrm">
<input type="text" name="userlList"  id="combox" width="150" />
</form>

JS:
var data=[[1,'用户一'],[2,'用户二']];
var combox=new makeCombo('combox',data,'用户列表');

//获取userList的值
var curValue=document.forms['testForm'].userList.value;
//设定userList当前值
document.forms['testForm'].userList.value=2;

封装代码:
/**
* 根据数据生成combox到指定的位置
* id:容器,data:数据,text:文本 width:ComboBox的宽度,默认为所绑定元素的宽度
*/
function makeCombo(id,data,text,width){
    var container=Ext.get(id);
    if(!container)return;
    var realInput;  //保存值的input
    return new Ext.form.ComboBox({
        store: new Ext.data.SimpleStore({
            //解决filter第一次无效的bug,保存原数据快照到另一个变量
            listeners:{datachanged:function(){if(!this.mySnap)this.mySnap=this.snapshot;delete this.snapshot}},
          fields: ['value', 'text'],
          data:data||[]
      }),
        editable:false,
        valueField:'value',
        displayField: 'text',
        typeAhead: true,
        lazyInit: false,
        width:width||container.getComputedWidth(),
        mode: 'local',
        listeners:{
            render:function(_this){
                realInput=Ext.DomHelper.insertAfter(container,{tag: 'input',type:'hidden',name:_this.getName(),value:_this.getValue()}) 
                realInput.onpropertychange=function(){_this.setValue(this.value)};  //真实表单联动模拟表单
                container.dom.removeAttribute('name');
                _this.clearFilter=function(){   //扩展一个方法还原store
                    _this.store.snapshot=_this.store.mySnap;
                    _this.store.clearFilter();
                }
            },
            select:function(combo,rec,index){   //模拟表单联动真实表单
                realInput.value=rec.get('value');
            }
        },
        triggerAction: 'all',
        emptyText: "请选择"+(text||''),
        selectOnFocus: true,
        applyTo: container
    });
}
分享到:
评论

相关推荐

    用Ext 2.0 combobox 做的省份和城市联动选择框的例程

    在本文中,我们将深入探讨如何使用Ext 2.0的ComboBox组件实现省份和城市联动选择框的功能。Ext是一个强大的JavaScript库,它提供了丰富的用户界面组件,包括ComboBox,用于创建下拉选择框。在这个例程中,我们将看到...

    EXT2.0中文教程

    TabPanel使用autoLoad加载的页面中的js脚本没有执行 B. 修改日志 C. 后记 C.1. 2007年12月5日,迷茫阶段 C.1.1. 仇恨 C.1.2. 反省 C.2. 关于ext与dwr整合部分的讨论 C.3. 怎么看文档附件里的范例 D. 贡献者列表 ...

    Ext 2.0 中文api 天涯浪子

    Ext 2.0 是一个基于JavaScript的开源框架,主要用于构建富客户端Web应用程序。这个框架以其强大的组件模型、数据绑定机制和丰富的用户界面组件而闻名。天涯浪子发布的这个中文API文档,为开发者提供了深入理解Ext ...

    Ext2.0本地模式动态修改combobox选择项

    标题中的“Ext2.0本地模式动态修改combobox选择项”指的是使用Ext JS 2.0框架中的Combobox组件在本地数据模式下实现动态更新选择项的功能。Ext JS是一个流行的JavaScript库,主要用于构建富客户端Web应用程序。...

    ext 2.0 form demo

    在这个"EXT 2.0 form demo"中,我们将深入探讨EXT在构建动态、交互式表单方面的强大功能。 一、EXT 2.0的核心特性 1. 组件化:EXT 2.0的核心是组件模型,允许开发者将UI元素(如按钮、表格、表单)视为独立的可...

    Ext2.0 form使用实例的例程

    Ext 2.0的表单组件提供了一整套完整的解决方案,包括各种输入字段、按钮、标签、提示信息等。下面将详细解析这些知识点: 1. **表单(FormPanel)**:这是Ext 2.0中的核心表单组件,它是一个容器,可以包含各种表单...

    ext2.0 树的增删改操作

    Ext2.0是一款基于JavaScript的富客户端应用框架,主要用于构建Web应用程序的用户界面。它提供了丰富的组件库,包括各种图表、表格、按钮、菜单、树形控件等。在这个项目中,我们主要关注的是"树的增删改操作"以及...

    Ext组合框comboBox带分页

    用EXT来实现下拉框ComboBox 下拉框可以实现分页

    Ext2.0 form使用实例

    Ext2.0 Form 使用实例详解 在Web应用开发中,ExtJS库提供了强大的用户界面组件,其中FormPanel是用于创建复杂表单的重要组件。本文将详细介绍Ext2.0 FormPanel的使用,包括创建方法、控件配置以及布局管理。 首先...

    Ext4.0 动态修改ComboBox选择项(本地模式)

    首先,ComboBox在Ext JS中是一个可选列表的输入控件,它可以展示一个下拉菜单供用户选择。在本地模式下,ComboBox的数据通常存储在本地,如JavaScript数组中,而不是从远程服务器获取。这样可以提高应用的响应速度,...

    ext combobox二级联动

    ext,ext combobox,ext二级联动,ext combobox二级联动 ___本人的原则:上传好东西,但绝不便宜.因为自己的心血 ext combobox二级联动,ext ,ext combobox,combobox,combobox二级联动,ext 二级联动 groupCombo.on('...

    EXT2_combobox_form.rar_combobox ext_ext

    EXT2_combobox_form.rar_combobox ext_ext 这个标题暗示我们关注的是一个与EXT2相关的项目,其中包含了关于form表单和combobox的示例。EXT是一个流行的JavaScript库,主要用于构建富客户端应用,特别是Web应用的用户...

    Ext带图标Combobox

    而"Ext带图标Combobox"(Ext IconCombobox)是Ext JS中的一个特色组件,它是Combobox(下拉框)与图标相结合的一种扩展形式,为用户提供了更加直观且美观的交互体验。 **1. Ext Combobox基础** 首先,我们需要了解...

    Ext 异步加载添加 删除节点 修改combobox选择项

    在Ext JS中,异步加载是一种常见的数据处理方式,尤其在构建动态的用户界面时非常有用。本篇文章主要探讨了如何在异步加载的场景下,实现树形控件(TreePanel)中节点的动态添加、删除以及ComboBox选择项的修改。 ...

    Ext combobox 下拉多选框带搜索功能

    在给定的标题“Ext ComboBox 下拉多选框带搜索功能”中,我们关注的是一个特别的ComboBox实现,它不仅允许用户从下拉列表中选择多个选项,还具备搜索功能,使得用户可以更高效地找到他们想要的选择项。 ComboBox在...

    用Ext 2_0 combobox 做的省份和城市联动选择框 DOJO中国

    在本案例中,“用Ext 2_0 combobox 做的省份和城市联动选择框”是一种交互式UI设计,常用于地理信息的选择,例如用户先选择省份,然后根据所选省份动态加载对应的城市选项。 Ext 2.0的Combobox组件主要包含以下几个...

    Ext 组合框 ComboBox 参数详解

    该资源是war包,里面包括ComboBox中的各个参数, 详细讲解在我的文档中有

    Ext ComboboxGrid

    "Ext ComboboxGrid"是一个基于Ext JS框架的组件,它结合了下拉框(ComboBox)和数据网格(Grid)的功能,提供了一种更强大的选择和筛选数据的方式。在Ext JS中,ComboBox通常用于显示一个可选的下拉列表,而Grid则...

    Extjs2.0中文文档

    Ext.js的官方文档是学习和参考该框架非常重要的资料,而Ext.js 2.0作为该框架的一个版本,其官方中文文档对于中文开发者来说是相当珍贵的学习资源。 文档涵盖了Ext.js 2.0的基础到高级特性,包括但不限于以下关键点...

    Ext comboBox的remote模式,联想功能实现

    在Ext JS的comboBox中,远程模式(remote mode)是一种数据加载策略,它适用于处理大量数据或实时数据的情况。在这种模式下,comboBox不会一次性加载所有选项,而是根据用户输入的关键词动态地向服务器发送请求,...

Global site tag (gtag.js) - Google Analytics