`
leon1509
  • 浏览: 533333 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ext.Window组件多次show或hide后combobox消失的问题

阅读更多
转载地址:http://www.iteye.com/problems/14728

问题描述,window中我放置了两个combobox,在tbar上设置按钮,负责显示window,并设置cancel按钮handler中函数,window.hide()令其隐藏。
一:单击tbar,window出来combobox,我没去动他,然后直接点cancel按钮,window隐藏,再点tbar,window正常显示出来,并且window中的组件完好。
二:问题出现,当我点开window,并且选了combobox中的选项后,我点cancel,也就是window.hide(),然后我又把window打开,这时,window中的combobox不见了。只有fieldLabel的文字。

请大家帮忙。
handler:function(){
					
	var gradeWin = new Ext.Window({
		title : '添加年级',
		width : 300,
		height : 150,
		plain : true,
		closeAction : 'hide',
		layout : 'form',
		labelWidth : 80,
		constrain : true, // windows不超过浏览器
		buttonAlign : 'center',
		modal : true,// 生成背景半透明div
		defaultType : 'textfield',
		defaults:{width:160},
		bodyStyle : 'padding:10px;',
		buttons : [{
			text : '确定',
			handler:function(){
											//   var stuTreeNode = Ext.getCmp('stuTree');
				//  alert(Ext.getCmp('myTree')) ;
				var tree = Ext.getCmp('myTree') ;
				var stuNode = tree.getNodeById('stuTree') ;
				var text = Ext.getCmp('gradeName').getValue().toString();
				var type = Ext.getCmp('gradeType').getValue();
				if(text != ''&& type != ''){
					var node = new Ext.tree.TreeNode({
						text:text,
						leaf:true
					});
					//stuNode.isLeaf = false ;    
					stuNode.appendChild(node);
					gradeWin.hide();
				}else Ext.Msg.alert('错误提示','有空选项,请重新填写');
				//alert(tree.getNodeById('stuTree'));
			}//ok function
		}, {
			text : '取消',
			handler : function() {
				gradeWin.hide();
			}
		}],
		items :[{
			xtype:'combo',
			fieldLabel:'年级名称',
			id:'gradeName',
			displayField : "text",
			valueField : "value",
			mode : 'local',
			triggerAction : 'all',
			store : new Ext.data.SimpleStore({
				fields : ['value', 'text'],
				data : [['2004级', '2004级'],['2005级', '2005级'], ['2006级', '2006级'],['2007级', '2007级'],['2008级', '2008级'],['2009级', '2009级'],['2010级', '2010级'],['2011级', '2011级'],['2012级', '2012级'],['2013级', '2013级'],['2014级', '2014级']]
			})
		},{
			xtype:'combo',
			fieldLabel:'年级类型',
			id:'gradeType',
			readOnly : true,
			displayField : "text",
			valueField : "value",
			mode : 'local',
			triggerAction : 'all',
			store : new Ext.data.SimpleStore({
				fields : ['value','text'],
				data : [['已毕业', '已毕业'],['未毕业', '未毕业']]
			})
		}]//items
	}) ;//end gradeWin
	gradeWin.show();
}



答案:
2009-04-13 mgssnake (中级程序员)
楼主的做法不对,你既然将gradeWin对象放在hanlder事件中创建的话,那你多次点击后,就创建了多个gradeWin对象,你把gradeWin创建的部分放在外部即可,在hanlder调用的时候把gradeWin.show();出来即可。


提问者对于答案的评价:
哦,明白了。之前我也是把hide() 改成 close(); 但总觉得效率不高,之后发现这样的问题出现的原因是因为加了Id属性,由于id相同,所以第二次点出的window里没有了里面的组件。



两种解决方法:
1. window组件不应该在显示window的函数中new,显示函数只负责window的show或hide方法
2. window内的combobox组件不要加id属性


我成功的代码:
Ext.namespace("sf.or");
Ext.extend(demo.module,{
	init: function(){
		Ext.Ajax.on("beforerequest", function(){_grid.loadMask.show();});
		Ext.Ajax.on("requestcomplete", function(){_grid.loadMask.hide();});
		Ext.Ajax.on("requestexception", function(){_grid.loadMask.hide();});

		this.configs = {
			url: {
				list: contextPath + 'outRequest/list',
				update: contextPath + 'outRequest/update',
				geAvaliableDrivers: contextPath + 'carInfo/getAvailableDrivers',
				combo: {
					cars: contextPath + 'carInfo/comboCars',
					dscr: contextPath + 'default/getComboList?domain=dicSendCarReason',
					dd: contextPath + 'default/getComboList?domain=dicDirection'
				}
			},
	        tpl: new Ext.XTemplate(
				'<table width="100%" id="expander-table" cellpadding="0">',
				'<tr><td class="driverList"><b>审批人:</b>{disApprovePersons}',
				'</td><td colspan="2" class="driverList"><b>已审批人:</b>{approvedPersions}</td></tr>',
				'<tr><td class="driverList"><h2>出车理由:</h2>',
				'<ul><li>{reason}</li></ul>',
				'</td><td class="driverList"><h2>去向:</h2>',
				'<ul><li>{direction}</li></ul>',
				'</td><td class="driverList"><h2>备注:</h2><ul><li>{memo}</li></ul>',
				'</td></tr></table>'
			),
			record: Ext.data.Record.create([
	    		{name: 'id', type: 'int'},
	    		{name: 'car'},
	    		{name: 'car.id'},
	    		{name: 'car.carNo'},
	    		{name: 'driver'},
	    		{name: 'driver.id'},
	    		{name: 'driver.account.name'},
	    		{name: 'requester.name'},
	    		{name: 'requestDate', type : 'date', dateFormat : 'Y-m-d H:i:s'},
	    		{name: 'sendOutDate', type : 'date', dateFormat : 'Y-m-d H:i:s'},
	    		{name: 'backDate', type : 'date', dateFormat : 'Y-m-d H:i:s'},
	    		{name: 'carCfg.approvePersions'},
	    		{name: 'disApprovePersons'},
	    		{name: 'carCfg.exceptiondateFlag'},
	    		{name: 'approvedPersions', type: 'string'},
	    		{name: 'approveFlag', type: 'int'},
	    		{name: 'approveFlagRate', type: 'int'},
	    		{name: 'reason', type: 'string'},
	    		{name: 'direction', type: 'string'},
	    		{name: 'flag', type: 'int'},
	    		{name: 'memo', type: 'string'}
	    	])
		};

		this.expander = new Ext.grid.RowExpander({tpl : this.configs.tpl});
		this.approveFlagColumn = new Ext.ux.grid.ProgressColumn({
			header: "审批进度",
			dataIndex: 'approveFlagRate',
			width: 15,
			//textPst : '%',
			colored: true
		});
    	this.columns = [
			this.expander,
			{header: '车辆编号', dataIndex: 'car.carNo', width: 15},
			{header: '驾驶员', dataIndex: 'driver.account.name', width: 20},
			{header: '派车人/日期', dataIndex: 'requester.name', width: 35, renderer: function(v, c, r){
				return v + "(" + (r.data['requestDate'] ? r.data['requestDate'].dateFormat('Y-m-d H:i:s') : '') + ")";
			}},
			{header: '出发时间 | 返回时间', dataIndex: 'sendOutDate', width: 40, renderer: function(v, c, r){
				return (v ? v.dateFormat('Y-m-d H:i:s') : '') + (r.data['backDate'] ? (" | " + r.data['backDate'].dateFormat('Y-m-d H:i:s')) : ''); }
			},
			{header: '特殊日?', dataIndex: 'carCfg.exceptiondateFlag', width: 12, renderer: function(v){
				return v == 2 ? '<image src="' + contextPath + 'images/flag_red.png" align="absmiddle">' : '';
			}},
			this.approveFlagColumn,
			{header: '状态', dataIndex: 'flag', width: 15, renderer: function(v){
				var renderMsg = '';
				switch (v){
					case 0 : renderMsg = "<font color='red'>任务执行中</font>"; break;
					case 1 : renderMsg = "待命"; break;
					case 2 : renderMsg = "<font color='green'>任务结束</font>"; break;
					default : renderMsg = "<span color='red'>状态错误</span>";
				}
				return renderMsg;
			}}
        ];

		this.stores = {
			list: new Ext.data.Store({
				url : this.configs.url.list,
		        reader : new Ext.data.JsonReader({ totalProperty : 'totalCount', root : 'result' }, this.configs.record )
			})
		};
		this.combos = {};
		this.functions = {
			lineColor: function(record,rowIndex,rowParams,store){
	            var _flag = record.data['flag'];
				var _css;
				if(_flag == "0") _css = 'x-grid-record-red';
				else if(_flag == "2") _css = 'x-grid-record-green';
				else _css = 'x-grid-record-gray';
	            return _css;
	        },
			add: function(){
				var win = new sf.or.dataWindow({owner:this});
				win.setTitle('<image src="' + contextPath + 'images/edit.png" align="absmiddle">&nbsp;填写派车单');
				win.setSize(win.fp.width, win.fp.height);
				win.show();
				win.url = _configs.url.update;
				win.fp.form.reset();
				//win.gridRole.getSelectionModel().clearSelections();
			},
	        edit: function(){
				var rec = _grid.getSelectionModel().getSelected();
				if (rec){
					var win = new sf.or.dataWindow({owner:this});
					win.setTitle('<image src="' + contextPath + 'images/edit.png" align="absmiddle">&nbsp;编辑派车单');
					win.setSize(win.fp.width, win.fp.height);
					win.show();
					//win.url = 'qo/user/updateUser/'+rec.data.id;
					win.fp.form.reset();
					win.fp.form.loadRecord(rec);
					/*if (rec.data.car){
						alert(111)
						win.fp.form.findField('car').setValue(rec.data.car.id);
						win.fp.form.findField('car').setRawValue(rec.data.car.carNo);
						//win.fp.form.findField('car').setFieldValue(rec.data.car.id, rec.data.car.carNo);
					}*/
				} else {
					Ext.Msg.show({title: "操作提示", msg: "警告:至少选择一条记录进行编辑!", buttons: Ext.Msg.OK, icon : Ext.Msg.WARNING });
				}
			}
		};

		sf.or.dataWindow = Ext.extend(Ext.Window, {
			closeAction:'hide',
			layout:'fit',
			modal:true,
			initComponent:function(){
				var conf = {
					border:false,
					buttons:[
						{ text:'保存', handler:this.onSave.createDelegate(this) },
						{ text:'取消', handler:this.onCancel.createDelegate(this) }
					]
				};
				Ext.apply(this, conf);
				sf.or.dataWindow.superclass.initComponent.call(this);
				this.createForm();
				this.add(this.fp);
			},

			createForm:function(){
				var driverStore = new Ext.data.Store({
					proxy: new Ext.data.HttpProxy({url: _configs.url.geAvaliableDrivers}),
					reader: new Ext.data.JsonReader({},['id','name'])
				});
				this.carStore = new Ext.data.Store({
					baseParams: {userId: g_userId},
					proxy: new Ext.data.HttpProxy({url: _configs.url.combo.cars}),
					reader: new Ext.data.JsonReader({},['id','carNo']),
					autoLoad:true
				});
				this.dicSendCarReasonStore = new Ext.data.Store({
					autoLoad: true,
			        proxy: new Ext.data.HttpProxy({ url: _configs.url.combo.dscr }),
					reader: new Ext.data.JsonReader({}, [ {name : 'id'}, {name : 'content'}, {name : 'flag'}, {name : 'memo'} ])
				});
				this.dicDirectionStore = new Ext.data.Store({
					autoLoad: true,
			        proxy: new Ext.data.HttpProxy({ url: _configs.url.combo.dd }),
					reader: new Ext.data.JsonReader({}, [ {name : 'id'}, {name : 'content'}, {name : 'flag'}, {name : 'memo'} ])
				});
				var driverCombo = new Ext.form.ComboBox({
					//id: 'driver',
					name: 'driver.account.name',
					fieldLabel: '选择驾驶员',
					emptyText: '请选择驾驶员...',
					valueField: 'id',
					displayField: 'name',
					//hiddenName: 'driver.id',
					store: driverStore,
					//editable: true,
					readOnly: true,
					triggerAction: 'all',
					mode: 'local',
					width: 200,
					allowBlank: false
				});
				[color=red][size=large]this.carCombo = new Ext.form.ComboBox({
					//id: 'car',
					name: 'car.carNo',
					fieldLabel: '选择车辆',
					emptyText: '请选择车辆...',
					store: this.carStore,
					valueField: 'id',
					displayField: 'carNo',
					//hiddenName: 'car.id',
					//editable: true,
					readOnly: true,
					triggerAction: 'all',
					mode: 'local',
					width: 200,
					allowBlank: false,
					listeners: {
						select: function(combo, record, index){
							driverCombo.clearValue();
							driverStore.load({params:{carId: combo.value}});
						}
					}
				});[/size][/color]
				this.sendOutDate = new Ext.ux.DateTime({
					name: 'sendOutDate',
					fieldLabel:'出发时间',
					anchor:'-18',
					readOnly: true,
					timeFormat:'H:i:s',
					timeWidth: 80,
					timeConfig: { altFormats: 'H:i:s', allowBlank: false },
					dateFormat: 'Y-m-d',
					dateWidth: 80,
					dateConfig: { altFormats: 'Y-m-d|Y-n-d', allowBlank: false }
				});
				this.backDate = new Ext.ux.DateTime({
					name: 'backDate',
					fieldLabel:'返回时间',
					anchor:'-18',
					readOnly: true,
					timeFormat:'H:i:s',
					timeWidth: 80,
					timeConfig: { altFormats: 'H:i:s' },
					dateFormat: 'Y-m-d',
					dateWidth: 80,
					dateConfig: { altFormats: 'Y-m-d|Y-n-d' }
				});
				this.dicSendCarReasonCombo = new Ext.form.ComboBox({
					name: 'reason',
					fieldLabel: '出车理由',
					store: this.dicSendCarReasonStore,
					valueField: 'content',
					displayField: 'content',
					//hiddenName: 'reason',
					width: 240,
			        mode: 'local',
			        triggerAction: 'all',
			        selectOnFocus: true,
					allowBlank: false
				});
				this.dicDirectionCombo = new Ext.form.ComboBox({
					name: 'direction',
					fieldLabel: '去向',
					store: this.dicDirectionStore,
					valueField: 'content',
					displayField: 'content',
					//hiddenName: 'direction',
					width: 240,
			        mode: 'local',
			        triggerAction: 'all',
			        selectOnFocus: true,
					allowBlank: false
				});

				this.fp = new Ext.form.FormPanel({
					width:400,
					height:340,
					//fieldWidth:120,
					labelAlign:'right',
					border:false,
					items:{
						xtype:'tabpanel',
						activeTab:'0',
						deferredRender:false,
						border:false,
						height:300,
						items:[{
							title:'基本信息',
							items:{
								border:false,
								bodyStyle:'padding:10px;',
								layout:'form',
								defaultType:'textfield',
								//defaults:{width:100},
								items:[
									this.carCombo,
									driverCombo,
									this.sendOutDate,
									this.backDate,
									this.dicSendCarReasonCombo,
									this.dicDirectionCombo,
									{ xtype: 'textarea', fieldLabel:'备注', name:'memo', width:250 }
								]
							}
						}]
					}
				});
			},

			onSave:function(){
				if (this.fp.form.isValid() == false) return;
				this.fp.form.submit({
					waitTitle: '提示',
					waitMsg: demo.working,
					url: this.url,
					//params:{ roleIds:roleIds.join(',') },
					success:this.onSaveSuccess.createDelegate(this),
					failure:this.onSaveFailure.createDelegate(this)
				})
			},

			onSaveSuccess:function(){
				_grid.getStore().reload();
				this.hide();
			},

			onSaveFailure:function(form,action){
				Ext.Msg.show({title: '操作提示', msg: action.result.info, icon: Ext.Msg.ERROR, buttons: Ext.Msg.OK});
			},

			onCancel:function(){
				this.hide();
			}

		});

		this.bbar = new Ext.PagingToolbar({
			pageSize: iPageSize,
			store : this.stores.list,
			plugins : new Ext.ux.Andrie.pPageSize(),
			displayInfo : true,
			items : [ '-',
				{xtype: 'button', iconCls: 'btn_insert', text: '增加', handler: this.functions.add, tooltip: '新增派车单' },
				{xtype: 'button', iconCls: 'btn_modify', text: '编辑', handler: this.functions.edit, tooltip: '编辑派车单' }
			]
		});
		this.editorGridPanel = new Ext.grid.EditorGridPanel({
			bodyStyle: 'width:100%',
			viewConfig: {forceFit: true, getRowClass: this.functions.lineColor},
			store: this.stores.list,
			sm: new Ext.grid.RowSelectionModel(),
			columns: this.columns,
			loadMask: {msg: demo.working},
			plugins: [this.expander, this.approveFlagColumn],
			//clicksToEdit: 1,
			//autoExpandColumn : 'memo',
			//tbar: this.tbar,
			bbar: this.bbar
        })
		var _configs = this.configs;
		var _combos = this.combos;
		var _stores = this.stores;
		var _functions = this.functions;
		var _grid = this.editorGridPanel;

		this.main.add(this.editorGridPanel);
        this.main.doLayout();

        _stores.list.load({
            params: {start: 0, limit: iPageSize}
        });
	}
});
分享到:
评论

相关推荐

    EXT.form组件

    2. `checkbox`:`Ext.form.Checkbox`是用于创建复选框的组件,用户可以选择或取消选择多个选项。 3. `combo`:`Ext.form.ComboBox`是下拉列表框组件,允许用户在预设的选项中进行选择,同时可以提供搜索功能以便...

    extjs-Ext.ux.form.LovCombo下拉框

    在EXTJS框架中,`Ext.ux.form.LovCombo`是一种自定义组件,它扩展了基本的`Ext.form.field.ComboBox`,提供了更丰富的功能,尤其是针对多选和联动选择的需求。这个组件通常用于创建具有“lov”(即“Look Up Value”...

    Ext组件描述,各个组件含义

    ### Ext组件概述与详解 #### 一、Ext基础组件 **1.1 Box Component (Ext.BoxComponent)** - **xtype**: `box` - **功能描述**:Box Component 是一个非常基本的 Ext 组件,主要用于定义具有边框和其他布局属性的...

    Ext.form.field.ComboBox结合Java、JSON实现AutoComplete

    本示例探讨如何利用Ext JS中的`Ext.form.field.ComboBox`组件,结合Java后端和JSON数据格式,来创建这样一个功能。 `Ext.form.field.ComboBox`是Ext JS框架中一个强大的组件,它提供了下拉列表的功能,可以用于创建...

    Ext.Store的获取方法

    在Ext.js中,`Ext.Store`是用来管理数据的类,它通常与各种UI组件(如Grid、ComboBox等)关联,用于存储和检索数据。然而,获取`Ext.Store`的方式并不像获取其他Ext组件那样直接,因为Store并不是一个具有可视界面的...

    Ext.form表单中各种属性应用详解

    **Ext.form.ComboBox** 是一个下拉列表框组件,用于提供可选列表供用户选择。 - **allQuery**: 类型为 `String`,当用户在组合框中输入时,此属性定义所有匹配的项都将显示在列表中。 - **autoCreate**: 类型为 `...

    EXT dojochina文本框示例Ext.form.TextField.rar

    总的来说,`Ext.form.TextField`是EXT框架中不可或缺的一部分,它提供了一种简单且灵活的方式来创建和管理用户输入,是构建Web表单和交互界面的关键组件。通过研究这个示例,开发者可以更好地掌握EXT框架的使用,...

    [Ext 3.x + Ext 2.x] 下拉树 Ext.ux.ComboBoxTree

    【Ext 3.x + Ext 2.x 下拉树 Ext.ux.ComboBoxTree】是基于ExtJS框架的一个组件,它结合了下拉框(ComboBox)和树形控件(TreePanel)的功能,提供了一种用户友好的选择界面。在网页应用中,这种控件常用于展示层级...

    可编辑表格Ext.grid.EditorGridPanel

    Ext.grid.EditorGridPanel是Ext JS库中的一个组件,主要用于创建具有可编辑单元格的表格。这个组件在数据展示和编辑方面提供了丰富的功能,是构建数据密集型应用的理想选择。下面将详细阐述其特点、工作原理及如何...

    Ext组合框comboBox带分页

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

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

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

    Ext Js权威指南(.zip.001

    Ex4.0共2个压缩包特性,《ext js权威指南》 前 言 第1章 ext js 4开发入门 / 1 1.1 学习ext js必需的基础知识 / 1 1.2 json概述 / 3 1.2.1 认识json / 3 1.2.2 json的结构 / 3 1.2.3 json的例子 / 4 1.2.4 ...

    ext多选下拉列表的全选功能实现

    "ext多选下拉列表的全选功能实现"这个主题聚焦于一个特定的UI组件——ExtJS库中的MultiComboBox,这是一种允许用户多选的下拉列表控件。在实际应用中,全选功能常常被用来快速选择所有选项,极大地提高了用户的操作...

    combobox Ext之扩展组件多选下拉框

    这种组件在需要用户从多个预定义选项中选取多个值的场景中非常实用,如数据筛选、用户角色选择等。 要实现多选下拉框,我们需要对原生的ComboBox进行以下改造: 1. **配置项设置**: - `multiSelect`:设置为`...

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

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

    Extjs4.X下comboboxTree下拉树型菜单,完美支持多选、单选,绝对好用

    这种组件在数据选择上非常实用,尤其当数据层级关系复杂时,可以方便地进行多选或单选操作。下面我们将深入探讨ComboboxTree的实现原理、主要功能以及如何在实际项目中应用。 1. **ComboboxTree的基本概念** ...

    EXT核心API详解

    53、Ext.form.DateField类 ………… 45 54、Ext.form.ComboBox类 ……………… 46 55、Ext.form.TimeField类 ………… 47 56、Ext.menu.Menu类 ………………… 50 57、Ext.menu.BaseItem类 …………… 50 58、Ext....

    Ext.data专题

    **Grid** 和 **ComboBox** 等组件都是基于Ext.data进行数据操作的。它们利用这些核心组件来实现诸如异步加载、类型转换、分页等功能。 #### 二、数据格式和支持 Ext.data支持多种数据格式,包括但不限于: - **...

    Ext组件说明 Ext组件概述

    ### Ext组件概述与初学者指南 #### 一、Ext组件概览 Ext是一个功能丰富的JavaScript框架,用于构建桌面级Web应用程序。它提供了大量的组件和工具,使得开发者能够快速且高效地构建用户界面。对于初学者而言,理解...

    extjs的ComboBox 2级联动

    ExtJS的ComboBox是一个非常强大的组件,它用于创建下拉选择框。在Web应用程序中,我们经常需要实现二级联动效果,即一个ComboBox的选择会影响另一个ComboBox的显示内容。这在数据关联和筛选场景中尤为常见,例如省份...

Global site tag (gtag.js) - Google Analytics