ExtJs 3 自定义combotree

/*** 自定义下拉树,支持初始化值时自动定位树节点。* 还没有考虑性能问题。继承自Ext.form.ComboBox也很浪费。* 代码中的cu.get()是自定义的异步请求方法。* @author Linzongxue* @create_date 2011-12-13*/
Ext.ux.ComboBoxTree = Ext.extend(Ext.form.ComboBox, {//树的配置项dataUrl: null, //获取树所有节点的url//通过id获取某个节点的id全路径的url,返回值的格式应该是:parentId1/parentId2/parentId3/../节点id//如果不设置这个值,下拉树不会自动定位节点并在初始化时显示文本nodePathUrl: null,loader: null,root: {},rootVisible: false,//树的选择模式rootSelectable: false, //根节点是否可选,默认为falsefolderSelectable: true, //目录是否可选,默认为trueleafSelectable: true, //叶子是否可选,默认为trueshowFullPath: false, //是否显示全路径rootValue: undefined, //根节点的值(通常根节点的取值与普通节点的取值不一样,如果一样则不需要设置此值)//原combo类的配置项store: new Ext.data.SimpleStore({fields:[],data:[[]]}),mode: 'local',triggerAction: 'all',editable: false,forceSelection: true,tree: null, //树控件,在expand方法中初始化//private: 用于防止combo收缩,在树的事件中控制此属性值preventCollapse: false,initComponent: function(){this.treeId = Ext.id();this.height = this.height || 200;this.tpl = String.format('<tpl for="."><div id="{0}" style="height:{1}px"></div></tpl>', this.treeId, this.height);Ext.ux.ComboBoxTree.superclass.initComponent.call(this);},setValue: function(value){if (Ext.isObject(value)){ //点击树节点时的选择this.doSetValue(value);}else{ //只是设置一个值,从后台获取这个值的路径,并在树中选中这个节点//console.log(value);if (!this.tree) this.initTree();if (value === this.tree.root.id || (Ext.isDefined(this.rootValue) && value === this.rootValue)){ //根节点this.tree.root.select();this.doSetValue(this.root);return;}var url = this.nodePathUrl;if (!url){this.doSetValue({id: value});return;}cu.get(url, {id: value}).done(function(path){//从后台发起请求获取id路径path = '/' + this.root.id + (path.indexOf('/') == 0 ? '' : '/') + path;var comboTree = this;this.tree.selectPath(path, 'id', function(success, node){comboTree.doSetValue(success ? node : null);});}, this);}},//private:设置值,参数value应该是一个对象doSetValue: function(value){var id = value ? value.id : '';var text = value ? value.text : '';if (value && (value.loader || value.attributes)){ //是树节点var isRootNode = (value.id == this.tree.root.id);if (isRootNode && Ext.isDefined(this.rootValue)){id = this.rootValue;}if (this.showFullPath){text = isRootNode ? '/' : value.getPath('text').replace('/' + this.tree.root.text, '');}}this.value = id;if(this.hiddenField){this.hiddenField.value = id; //设置表单域}this.lastSelectionText = text;this.el.dom.value = text; //显示的值this.fireEvent('select', this, value);},getValue : function(){return Ext.isDefined(this.value) ? this.value : '';},//取得选中的树节点getValueNode: function(){return this.tree ? this.tree.getSelectionModel().getSelectedNode() : null;},getText: function(){return this.lastSelectionText || '';},reload: function(){if (!this.tree) return;var node = this.tree.getSelectionModel().getSelectedNode();var path = node ? node.getPath() : null;this.tree.getLoader().load(this.tree.root, function(){if (path) {this.tree.selectPath(path);}}, this);this.preventCollapse = true;},//private: 根据preventCollapse属性判断是否要收缩collapse: function(){if (this.preventCollapse){this.preventCollapse = false;return;}Ext.ux.ComboBoxTree.superclass.collapse.call(this);},//private:expand : function(){Ext.ux.ComboBoxTree.superclass.expand.call(this);if (!this.tree){this.initTree();}},//private:destroy: function(){if (this.tree && this.tree.rendered) this.tree.destroy();Ext.form.ComboBox.superclass.destroy.call(this);},//privateinitTree: function(){if (!this.list){ //必须先初始化列表,在一开始就设置了combotree的值时尤其重要,发现这个问题花了半天时间this.initList();}//设置this.preventCollapse=true,防止combo收缩var enableCollapse = function(){this.preventCollapse = false;};//设置this.preventCollapse=false,允许combo收缩var disableCollapse = function(){this.preventCollapse = true;};this.tree = new Ext.tree.TreePanel({renderTo: this.treeId,useArrows: false,autoScroll: true,height: this.height,  //修复IE的buganimate: true,enableDD: false,containerScroll: true,border: false,dataUrl: this.dataUrl,loader: this.loader,root: this.root,rootVisible: this.rootVisible,
//          bbar:[
//              '->', {text: '刷新', handler: this.reload, iconCls: 'icon-refresh', scope: this} //由于宽度问题取消此功能
//          ],listeners: {click: function(node){disableCollapse();if (node == this.tree.root){ //选中根节点if (!this.rootSelectable) return;}else if (!node.isLeaf()){ //选中目录节点if (!this.folderSelectable) return;}else{ //选中叶子节点if (!this.leafSelectable) return;}//先选择节点,再设置value,让getNodeValue方法在select事件中取到正确的值node.select();this.setValue(node);enableCollapse();},//展开和收缩节点时防止combo收缩beforeexpandnode: disableCollapse,beforecollapsenode: disableCollapse,beforeload: disableCollapse,//节点加载和展开后允许combo收缩load: enableCollapse,expandnode: enableCollapse,scope: this}});}
});
Ext.reg('combotree', Ext.ux.ComboBoxTree);/****************  下面是一个使用例子  ***********************/
new Ext.ux.ComboBoxTree({fieldLabel:'父菜单',hiddenName: 'parentId',value: this.modifyId ? '' : this.parentMenu.id,height: 180,dataUrl: 'sys/menu/getMenus.do',nodePathUrl: 'sys/util/getEntityIdPath.do?c=sys.entity.Menu',root: {id:'root', text:'根菜单', expanded: true},rootVisible: true,rootSelectable: true,rootValue: null,showFullPath: true,allowBlank: false,
});
1 楼 chuanmeiwc 2011-12-29  
cu.get这个方法能不能一并贴出来呢?

2 楼 chuanmeiwc 2011-12-29  
chuanmeiwc 写道
cu.get这个方法能不能一并贴出来呢?

这个问题可以忽略了,还有个问题想请教下:
如果llowBlank设置为true,选中某个节点之后想清空值怎么办呢?

3 楼 chuanmeiwc 2011-12-30  
chuanmeiwc 写道
chuanmeiwc 写道
cu.get这个方法能不能一并贴出来呢?

这个问题可以忽略了,还有个问题想请教下:
如果llowBlank设置为true,选中某个节点之后想清空值怎么办呢?

我的解决办法是在构造tree的时候增加一个带有清除按钮的tbar:

var combo = this;this.tree = new Ext.tree.TreePanel({renderTo: this.treeId,useArrows: false,autoScroll: true,height: this.height,  //fix IEanimate: true,enableDD: false,containerScroll: true,border: false,dataUrl: this.dataUrl,[color=red]tbar: [{text:'清空',xtype:'button',iconCls:'reset',handler:function(){combo.setValue(null);}}],[/color]loader: this.loader,root: this.root,rootVisible: this.rootVisible

还有没有更好的解决办法呢?
另外还有个问题:
获取某个节点的值时只能用 Ext.getCmp('comboboxtree').getNodeValue().id 吗?我试了getValue()和getRawValue(),均不能获取到节点的id。但是使用这个方法获取节点id有个问题,只有点击了comboBox之后,才会异步获取树,因此没有点击过comboBox的时候,Ext.getCmp('comboboxtree').getNodeValue()的值为null,所以使用Ext.getCmp('comboboxtree').getNodeValue().id之前要先判断Ext.getCmp('comboboxtree').getNodeValue()是否为null,否则会报错。
这个问题你有别的办法解决吗?

4 楼 chuanmeiwc 2011-12-30  
chuanmeiwc 写道

如果allowBlank设置为true,选中某个节点之后想清空值怎么办呢?

我的解决办法是在构造tree的时候增加一个带有清除按钮的tbar:

var combo = this;
    this.tree = new Ext.tree.TreePanel({
    renderTo: this.treeId,
    useArrows: false,
        autoScroll: true,
        height: this.height,  //fix IE
        animate: true,
        enableDD: false,
        containerScroll: true,
        border: false,
dataUrl: this.dataUrl,
tbar: [{text:'清空',xtype:'button',iconCls:'reset',handler:function(){combo.setValue(null);}}],
loader: this.loader,
root: this.root,
rootVisible: this.rootVisible

还有没有更好的解决办法呢?
另外还有个问题:
获取某个节点的值时只能用 Ext.getCmp('comboboxtree').getNodeValue().id 吗?我试了getValue()和getRawValue(),均不能获取到节点的id。但是使用这个方法获取节点id有个问题,只有点击了comboBox之后,才会异步获取树,因此没有点击过comboBox的时候,Ext.getCmp('comboboxtree').getNodeValue()的值为null,所以使用Ext.getCmp('comboboxtree').getNodeValue().id之前要先判断Ext.getCmp('comboboxtree').getNodeValue()是否为null,否则会报错。
这个问题你有别的办法解决吗?

5 楼 zxlaiye 2011-12-31  
chuanmeiwc 写道
chuanmeiwc 写道
cu.get这个方法能不能一并贴出来呢?

这个问题可以忽略了,还有个问题想请教下:
如果llowBlank设置为true,选中某个节点之后想清空值怎么办呢?

这个。。还没有考虑 ,因为才开始使用ExtJs没多久,很多应用细节还没机会去尝试。我觉得你的方法也挺好了,添加“清空”的同时顺便再加上一个“刷新”树节点的控制都不错。

6 楼 zxlaiye 2011-12-31  
to chuanmeiwc

在我贴代码之后又做了一些修改,但是修改后没有及时更新上来,太多事情要处理了啊。。。
你说的通过getValue()取不到值的问题,很可能是之后解决的,不用getNodeValue().id那么麻烦。。。,另外,异步发送请求的方法cu.get(...).done(...)只是对Ext.ajax.request做了简单的封装,并且添加了全局的异常处理而已。这种写法是从jquery里学过来的,我还摆脱不了一些jquery的使用习惯。

7 楼 chuanmeiwc 2011-12-31  
getValue()咋修改的呢?

8 楼 zxlaiye 2011-12-31  
chuanmeiwc 写道
getValue()咋修改的呢?

getValue()方法只是简单地返回this.value,关键是doSetValue()方法中对value的设置。现在是不是可以取到正确的值了?如果是就应该是之前的doSetValue()方法有问题,具体修改了什么地方我想不起来了。。。太久了。。

9 楼 silence1214 2012-03-15  
哥们 这个value的值死活出来不了

10 楼 silence1214 2012-03-15  
哥,这个例子中当一个页面多次操作的时候会把上次的数据附加到这里来,比如之前树中只有1,2在打开就是1,2,1,2 只有点刷新 才可以 这是怎么回事啊,我死活找不到修改的地方

11 楼 silence1214 2012-03-16  
经过昨晚一夜奋战,上午奋战。发现那个root一定要配置 哪怕是不需要。否则问题一大堆。。。

ExtJs 3 自定义combotree相关推荐

  1. ExtJS 中自定义类

    首先我们来看一看在Javascript中,是怎样自定义类的: var Person = function (name, age) {this.Name = "";this.Age ...

  2. ExtJS 表格自定义列-动态widget

    一.需求: 表格中根据数据不同,动态渲染出不同的组件. 二.环境: 1.操作系统: Microsoft Windows 10 专业版 2.OS 版本:          10.0.14393 暂缺 B ...

  3. ExtJs之自定义事件

    1.新建一个实践类 1 Employee = function(name) 2 { 3 4 this.name = name; 5 6 this.addEvents({ 7 8 "fired ...

  4. ExtJS4.2:自定义主题 入门

    背景 用过 ExtJs 的朋友都有一种趋势:审美疲劳,好在 Ext4.1 之后的版本提供了快速自定义主题的功能,本文的内容主要来自:http://docs.sencha.com/extjs/4.2.2 ...

  5. ExtJS(3)- 自定义组件(星级评分)

    今天介绍ExtJS的组件开发,这里以星级评分为示例,首先来看看效果图: 然后是功能操作:鼠标移动到五个星星上面时,会有tooltip显示当前的分值.如图:鼠标悬停在第四颗星星时前四颗星星显示高亮笑脸, ...

  6. html加上 extjs右键,extjs 处理HTML事件和自定义事件

    1. 处理HTML元素的标准事件 HTML元素的标准事件是指mouseover.mousedown.click. blur.focus.change等.在ExtJS中,这些事件的处理如下: 注册一个事 ...

  7. 63.ExtJs事件(自定义事件、on、eventManager)示例

    转自:https://blog.csdn.net/leadergg/article/details/5927614?utm_source=blogxgwz5 ExtJs事件(自定义事件.on.even ...

  8. extjs 添加css样式_ExtJS自定义css样式

    [  1.使用工具:      <1>Firebug: 能方便得出页面中各个元素的css标记名:             (1) Firebug 的下载.安装:               ...

  9. EXTJS之Ext.util.Observable自定义事件

    暂时还不会用Ext.mixin.Observable, 催悲的测试了近两个小时.这TMD的语法差距也太大了啊.. 在新版EXTJS里,已去除了addEvents. 弄个出来,大概知道下吧. ? 1 2 ...

最新文章

  1. 三下乡辅导孩子计算机知识,【青春“三下乡”】普及家庭教育知识,共促孩子健康成长...
  2. content 内容生成技术2
  3. oracle正在没落,Oracle停掉一个正在运行的job
  4. wince 6.0 设备管理器架构
  5. XML 文档(0, 0)中有错误。缺少根元素。
  6. Java Web学习(二)数据加密
  7. 转:MVC3系列:~Html.BeginForm与Ajax.BeginForm
  8. 为什么写公众号,为什么改名字
  9. SpUtil多样加密存储,兼容android9.0
  10. 慎用 apt-get autoremove !
  11. 转载:CSDN mvc ef 的简单增删改查操作
  12. Sentinel-1A数据 GRD和SLC的区别
  13. 统一诊断服务(UDS)否定响应也可以被抑制
  14. excel 如何将带杠的日期转换成不带杠的格式
  15. Hdu2184汉诺塔VIII
  16. GIS开发中常用几何算法原理图解
  17. 鼠标图标怎么自定义_苹果ios14怎么自定义图标 图标位置自由排列换风格教程
  18. 遗传算法之扇贝的进化(python代码实现)
  19. office运行时错误,部分系统文件可能丢失或已损坏(错误代码:0x80040154)
  20. 导入/导出dBase

热门文章

  1. Ubuntu安装教程【超多图】
  2. vsphere通用配置_Mac环境下如何用Hexo+Github搭建个人博客
  3. 致客户的一封信:关于产品生命周期管理与高可用版本的提供
  4. 神策 FM | 我绝对想要那个 VS 我可能想要那个
  5. 干货下载 | 评估产品增长,勿陷入“土著思维”
  6. 我们坚持专业与创新,U can U up
  7. 百度视频携手神策数据 为用户精准推送短视频内容
  8. 【干货下载】金融大数据专场沙龙内容分享
  9. 20181009-9 每周例行报告
  10. 数据预处理(Python scikit-learn)