`
simen_net
  • 浏览: 307099 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

ExtJS3 下拉树TreeComboBox的修改

阅读更多

先来一个效果图,已在Firefox3.5、IE7、Chrome3中测试正常

完整应用和代码请转到 http://www.iteye.com/topic/553020


 

拜读了[Ext 3.x + Ext 2.x] 下拉树 Ext.ux.ComboBoxTree 学习了不少东西,但和自己现用的TreeComboBox比较还是发现有些地方不妥,这里列出来大家探讨一下

1、xiexueze修改的下拉树每次展开时都会加载一次json,我测试的结果,不知道是不是我配置不当造成

2、tree貌似必须从外部传递进来,而tree在扩展内部实现

3、不是问题的问题,扩展定义了很多默认属性,修改了一些底层的方法

现在提出我的代码,其实也是ExtJS2.0的时候从其他地方学过来的,自己修改了一些代码,具体出处已经忘记了,如大家发现了请指出,谢谢

Ext.namespace("Ext.ux.form");

Ext.ux.form.TreeComboBox = Ext.extend(Ext.form.ComboBox, {

      initComponent : function(ct, position) {
        this.divId = 'tree-' + Ext.id();
        if (isNaN(this.maxHeight))
          this.maxHeight = 200;
        Ext.apply(this, {
              tpl : '<tpl>' + '<div style="height:' + this.maxHeight + 'px;">' + '<div id="' + this.divId + '"></div>' + '</div></tpl>'
            });

        var root = new Ext.tree.AsyncTreeNode({
              text : this.rootText,
              id : this.rootId,
              loader : new Ext.tree.TreeLoader({
                    dataUrl : this.treeUrl,
                    clearOnLoad : true
                  })
            });

        this.tree = new Ext.tree.TreePanel({
              border : false,
              root : root,
              rootVisible : this.rootVisible,
              listeners : {
                scope : this,
                click : function(node) {
                  this.setValue(node);
                  this.collapse();
                }
              }
            });

        Ext.ux.form.TreeComboBox.superclass.initComponent.call(this);
      },

      onRender : function(ct, position) {
        Ext.ux.form.TreeComboBox.superclass.onRender.call(this, ct, position);

        this.on("expand", function() {
              if (!this.tree.rendered) {
                this.tree.render(this.divId);
              }
            }, this)

      },

      /*以下代码是为了将tree的node设置到combo中 因为我还有一些其他的作用,所以我是将这部分的代码重写到其他地方了
      setValue : function(node) {
        if (typeof node == "object") {
          this.setRawValue(node.text);
          if (this.hiddenField) {
            this.hiddenField.value = node.id;
          }
        } else {
          this.setRawValue(node);
        }
      }
      */

    });

Ext.reg('uxtreecombobox', Ext.ux.form.TreeComboBox);

 之前的setValue我是直接覆盖了combo的方法

Ext.override(Ext.form.ComboBox, {
      setValue : function(node) {
        if (typeof node == "object") {
          // 当node为object对象时 node和tree里面的对应
          this.lastSelectionText = node.text;
          // 设置显示文本为node的text
          this.setRawValue(node.text);
          if (this.hiddenField) {
            // 设置隐藏值为node的id
            this.hiddenField.value = node.id;
          }
          this.value = node.id;
          return this;
        } else {
          // 当node为文本时 这段代码是从combo的源码中拷贝过来的 具体作用不细说了
          var text = node;
          if (this.valueField) {
            var r = this.findRecord(this.valueField, node);
            if (r) {
              text = r.data[this.displayField];
            } else if (Ext.isDefined(this.valueNotFoundText)) {
              text = this.valueNotFoundText;
            }
          }
          this.lastSelectionText = text;
          if (this.hiddenField) {
            this.hiddenField.value = node;
          }
          Ext.form.ComboBox.superclass.setValue.call(this, text);
          this.value = node;
          return this;
        }
      }
    })

 为什么要重写这个方法,请参考Ext.form.ComboBox加载json时刻默认选中的 ...

下面是使用的代码

xtype : 'uxtreecombobox',
id : 'Ext.Strong.tyh.combo.yhBmid',
hiddenName : 'yhBmid',
fieldLabel : '${action.getText("YH_BM")}',
editable : false,
shadow : true,
maxHeight : 200,
mode : 'local',
displayField : 'text',
valueField : 'id',
triggerAction : 'all',
allowBlank : false,
treeUrl : '<@s.url action="tbm_Shu_XianShi!json"/>',
rootText : 'root',
rootId : '0',
// api里面的意思是
//【true to restrict the selected value to one of the values in the list, false to allow the user to set arbitrary text into the field (defaults to false)】
// 我的理解是combo中设置的值
// 能否为不在store中的内容
// 因为如果默认设置为false的时候每次在失去该combo对象的焦点时刻会触发一个事件重新设置一下value
// 这个问题我解决了好久才搞定
forceSelection : true,
rootVisible : false
 

为什么forceSelection : true,我们看一下源代码

    beforeBlur : function(){
        var val = this.getRawValue(),
            rec = this.findRecord(this.displayField, val);
        // 注意这里 如果rec不存在且forceSelection为true
        if(!rec && this.forceSelection){
            if(val.length > 0 && val != this.emptyText){
                this.el.dom.value = Ext.isDefined(this.lastSelectionText) ? this.lastSelectionText : '';
                this.applyEmptyText();
            }else{
                this.clearValue();
            }
        }else{
            if(rec){
                val = rec.get(this.valueField || this.displayField);
            }
            this.setValue(val);
        }
    },

 总结一下,ExtJS的确实存在很多陷阱,很多简单的应用都必须从底层去解决,但是也提供了很好的学习机会,ExtJS的代码很多地方都值得我们去认真学习

  • 大小: 37.3 KB
分享到:
评论
6 楼 wa114d 2014-01-12  
楼主,当我将forceSelection : true的时候,点击节点不能将值赋值给文本啊
5 楼 mingchong2882 2010-09-02  
TriggerField  也不行吧。。还是没有好的解决方法,楼主不在
4 楼 crazy.j 2010-09-02  
用继承ComboBox么?很多方法不合适吧~继承TriggerField就OK了
3 楼 mingchong2882 2010-09-02  
不知道楼主是什么版本的EXT,本人是3.2的
2 楼 mingchong2882 2010-09-02  
不加上this.store = new Ext.data.SimpleStore({ fields: [], data: [[]] });就会出错的
1 楼 mingchong2882 2010-09-02  
this.on("expand", function() {
            alert(this.tree.rendered)
            if (!this.tree.rendered) {
                this.tree.render(this.divId);
            }
        }, this)

造成数据延迟,当forceSelection: true时会出问题,因为没有展示的下拉数据,是无法选中某项的

相关推荐

    ExtJs3下拉树

    ExtJs3下拉树 分两种方式调用:第一种: xtype : 'combotree', name : 'dm', fieldLabel : 'dm', tree : this.ct this.ct = new Ext.tree.TreePanel({ autoScroll : true, height : 250, border : false, ...

    ExtJs4.2下拉树(修改版)

    ExtJs4.2没有直接提供下拉树这个组件,但是有例子可以用,文件位置:ext-4.2.1.883\examples\ux\TreePicker.js 但是它有点小毛病吧:默认显示了根节点;达到最小高度时再展开节点,高度不能自动调整。 所以我做了一...

    Extjs4 下拉树 TreeCombo

    ExtJS 4 下拉树(TreeCombo)是一种组合控件,它将传统的下拉框与树形结构结合在一起,提供了一种在有限空间内展示层级数据的高效方式。这种控件在很多场合都非常实用,例如在需要用户选择分类或者层级结构的场景中...

    Extjs4下拉树菜单ComboBoxTree支持单选和多选并且支持展开选中指定节点的通用控件

    在这个特定的情况下,我们讨论的是一个定制的下拉树菜单控件——ComboBoxTree,它在ExtJS4中实现了单选和多选功能,并且具备展开选中指定节点的能力。这个控件在实际项目中已经被广泛使用并证明了其稳定性和实用性,...

    Extjs下拉多选树

    1. **下拉树组件**:在ExtJS中,树形组件(TreePanel)用于展示层次结构的数据。它支持动态加载、拖放操作、节点展开和折叠等功能。而下拉树是将树形结构嵌入到下拉框中,通常用于选择一组相关的项目,比如文件夹...

    extjs下拉树

    ExtJS下拉树是一种在Web应用中常用的交互组件,它结合了下拉框和树形结构的优点,使得用户可以在一个紧凑的空间内选择嵌套层次的数据。这种组件在数据层级较多,需要用户进行逐级选择或者查看层级关系时非常实用。在...

    ExtJs下拉树

    在ExtJS中,下拉树(ComboBoxTree)是一种结合了下拉框和树结构的组件,它允许用户从一个展开的树形列表中选择值,而不是传统的单行文本输入或简单的下拉列表。这种组件在数据层级结构复杂且需要用户进行多级选择时...

    ExtJS4下拉树组件

    在ExtJS4中,下拉树组件(TreeComboBox)是一种特殊的组合框,它结合了下拉列表和树形结构的功能,允许用户通过选择树节点来填充组合框的值。这种组件广泛应用于需要展示分层数据结构的应用场景中。 #### 二、核心...

    Extjs4 下拉树( v1.0版本有bug,已经上传一个可以用的)

    标签中的“源码”意味着可能包含了EXTJS 4下拉树组件的源代码,这对于开发者来说非常有价值,因为可以直接查看和修改源代码来适应特定需求,或者研究其内部工作原理。而“工具”标签则表明这可能是一个辅助开发的...

    Extjs6中利用treePicker实现的下拉树中

    利用extjs6自带的treePicker插件,实现下拉树的效果

    Extjs实现下拉菜单效果

    首先,我们需了解ExtJS下拉树(TreeComboBox)的概念。下拉树结合了ExtJS的ComboBox和TreePanel的功能,它不仅可以下拉显示列表项,还能够以树形结构的方式展示层级数据,允许用户通过树形结构选择一个或多个节点。 ...

    ExtJS3 实现异步下拉树

    在ExtJS 3中,实现异步下拉树涉及到几个关键概念和技术。 首先,理解“异步”意味着数据不是一次性加载完毕,而是按需加载。在下拉树中,当用户展开树节点时,只加载该节点及其子节点的数据,这减少了初始页面加载...

    Extjs自定义组件-下拉树

    ### Extjs自定义组件——下拉树:深入解析与实现 在现代Web开发中,Extjs作为一款功能强大且灵活的框架,深受开发者喜爱。它提供了丰富的UI组件库,能够帮助开发者快速构建复杂的用户界面。其中,自定义组件是Extjs...

    extjs4 实现下拉树并支持复选

    在EXTJS4中,实现一个下拉树(Combobox Tree)并支持多选和复选功能,主要是通过自定义组件(Ext.define)来完成的。这个组件继承自EXTJS的Picker字段(Ext.form.field.Picker),并添加了树形结构和复选功能。以下...

    Extjs ComboBoxTree 下拉树组件

    文件"ComboBoxTree"可能是实现这一组件的源代码或者配置文件,包含了实现下拉树组件的JavaScript代码和相关的配置信息。如果需要深入了解或修改这个组件,你需要查看这个文件的内容,理解其中的数据结构、事件处理和...

    Extjs4 多选下拉树

    在ExtJS4中,多选下拉树(Multi Select Tree)是一种用户界面组件,它结合了下拉菜单和树形结构,允许用户从层级结构中选择多个项目。这个组件在数据管理、分类选择等场景中非常实用。 在实现多选下拉树时,我们...

    Extjs4下拉菜单ComboBox中用Grid显示通用控件

    在EXTJS4中,`ComboBox` 是一个非常常用的组件,它提供了一个下拉选择框的功能。在某些场景下,我们可能需要在下拉菜单中展示更丰富的信息,比如表格数据,这时就可以使用 `GridComboBox`。`GridComboBox` 结合了 `...

    extjs4 下拉菜单树 combobox+tree 支持单选多选

    在EXTJS4中,下拉菜单树(ComboBox+Tree)是一种高级UI组件,它结合了ComboBox的下拉选择框和TreePanel的树形结构,提供了一种用户友好的交互方式,用于展示层次化的数据。这种组件特别适用于需要从多个选项中进行...

    ExtJS下拉列表树控件

    在ExtJS中,下拉列表树控件(ComboBox Tree)是常见的组件之一,它结合了下拉列表和树结构,提供了更丰富的用户界面。这个控件允许用户从一个层级化的数据结构中进行选择,非常适合于展示有层次关系的数据。 在创建...

    Extjs6 下拉列表

    在ExtJS6中,下拉列表(ComboBox)是一种常见的组件,用于提供用户可以选择的预定义选项。这个框架提供了丰富的功能和定制性,使得下拉列表不仅能够简单地显示一组静态选项,还能与数据源进行联动,展示动态加载的...

Global site tag (gtag.js) - Google Analytics