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

Ext学习笔记09 - ComboBox,Store

    博客分类:
  • Ext
阅读更多

ComboBox

ComboBox是指下拉菜单,在API中找到ComboBox对应的xtype是 combo

应用 Window 布局的笔记中的窗体,其中性别 Gender 这一项选项只有两个(male, female),可以使用 ComboBox 控件,为Gender 一项加上 xtype,值为 combo

{
	fieldLabel:"Gender",
	xtype:"combo"
},

 
看,已经是一个下拉框的样子了,但是这时Photo中的图片又显示不出来了,还是那个原因,textfield少了一个,需要调整 索引位置。

 

ComboBox使用的过程中是很复杂的,就像Dojo中的ComboBox 和 FilteringSelect,在实际应用中的根据不同的需求,应用起来非常灵活。

 

接下来要为下拉框中赋值,Ext 对于数据存取都封装在了data 中,存储数据分为 GroupingStore,JsonStore 和SimpleStore,在这里使用SimpleStore,它是负责解析数据的数据存储器,通常用来存储数组数据,通过ArrayReader来解析读取数组,看一下ArrayReader在API中的定义

在API提供的示例中给出了ArrayReader存储数组数据的方式,了解了这一点,再来看SimpleStore


SimpleStore中有两个重要的也是最常用的构造参数,Fields 和 Data

  • data:用来存放SimpleStore目标数据,以数组形式存在
  • fields:field对象定义的数组,也可以是field名字的字符串

SimpleStore中定义的数组都是用ArrayReader来读取的,ArrayReader是封装的一个基础工具类,将读取数组这个常用的操作抽取了出来。 

 

ComboBox中两个常用的构造参数 displayField 和 mode: 

 

displayField:

绑定到当前ComboBox中的基础数据的field名字,未定义的默认值为 mode='text' 或 mode='remote'

 

mode:

ComboBox 加载数据的方式,默认从远程服务器加载,如果ComboBox加载本地数据,需要设置 mode='local'。

 

在Gender一项中,只要从本地加载数据就可以了,它的值是确定的,并且不需要修改(如果是需要配置的值或者经常变动的值需要从服务器端加载,但是只有当点击ComboBox向下箭头的时候才会从服务器端发出加载数据请求,这样会产生用户体验的延迟)

 

来看代码:

{
	fieldLabel:"Gender",
	xtype:"combo",
	/* 显示 data 的 field 名称 */
	displayField:"gender",
	/* 从本地加载数据 */
	mode:"local",
	readOnly:true,
	store:new Ext.data.SimpleStore({
			/* 定义 dataStore 名称 */
			fields:["gender"],
			/* 定义 data 内容 */
			data:[["Male"],["Female"]]
		})
},

 

下拉菜单的效果就出来了:

 

 同样需要设置 readOnly 这个参数,避免用户的误操作。但是这样又出现了一个问题,Ext中的ComboBox提供了一种自动匹配的功能,比如下拉菜单中有一系列数据,我们想找到javaeye这样的选项,当输入字母 j 的时候,下拉列表中会查询出所有以 j 开头的字符串,其他的选项不会显示,也就是说,Gender中只有两项male和female,当选择其中之一之后,另外的选项就不会显示了,而且是readOnly,如果第一次操作用户选错了,希望重选就没有办法操作了,除非刷新页面,这样是不合理的。

 

这种情况下,有另外一个构造参数可以解决这个问题:

当触发下拉动作被激活时执行这一操作。默认的参数是“query” 即执行查询来匹配用户输入结果,使用参数“all” 会显示所有的结果。需要在ComboBox定义中加上这一句:

/* 显示所有结果 */
triggerAction:"all",

 

这样,当选中一个结果之后,再次点击向下箭头,所有的结果都可以被选择。

 

照葫芦画瓢,在 Depart 这一项也把 textfield 换成 comboBox

 

首先Depart这个textfield有点长,我们要把它变的短一些,但是前面在整个 Window 的布局中使用的锚点布局而使 width 这个构造参数失效了,要改变 textfield 的长度还是需要 再使用 锚点 来进行调整

{
	fieldLabel:"Depart",
	anchor:"46.5%"
}

 

宽度调整到46.5%以和上面的文本框对齐

 

{
	fieldLabel:"Depart",
	xtype:"combo",
	anchor:"46.5%",
	displayField:"depart",
	mode:"local",
	triggerAction:"all",
	store: new Ext.data.SimpleStore({
			fields:["depart"],
			data:[["Sale"],["Development"],["Management"],["Other"]]
		})
}

 

 宽度设置成46.5%,以便和上面的对齐,效果

成功!

 

把 depart 这一项内容加载的事件放到 当窗口show的时候默认显示下拉菜单中的第一个选项:

showLock:false,		
listeners:{
	"show":function(_window){
				if(!_window["showLock"]){
					_window.findByType("textfield")[4].getEl().dom.src = "../../../image/default_pic.gif";
					_window["showLock"]=true;				
				}
				
				var _depart = _window.findByType("combo")[1];
				var _store = _depart.store;
				_depart.setValue(_store.getAt(0).get("depart"));
			 }
},

 

这样,window 调用 show 方法的时候就会默认显示第一个值了。

 

如果下拉列表里面没有我需要的值怎么办? 对于这样的需求可以在 Depart 后面跟上一个按钮,允许用户添加所需要的Depart的值,然后填充到Depart中。

 

在一行中左边显示 ComboBox, 右边显示 Button 该怎么办呢?这就需要用到前面说到的列布局,需要小改动一下代码:

{
	fieldLabel:"Address",
	width:"400"
},{
	xtype:"panel",
	layout:"column",
	baseCls:"x-plaint",
	items:[{
		columnWidth:.5,
		layout:"form",
		labelWidth:45,
		baseCls:"x-plaint",
		items:[{
			fieldLabel:"Depart",
			xtype:"combo",
			anchor:"100%",
			displayField:"depart",
			mode:"local",
			triggerAction:"all",
			store: new Ext.data.SimpleStore({
						fields:["depart"],
						data:[["Sale"],["Development"],["Management"],["Other"]]
					})
		}]
	},{
		columnWidth:.5,
		layout:"form",
		baseCls:"x-plaint",
		bodyStyle:"padding-left: 10px",
		items:[{
			xtype:"button",
			text:"Add Depart"
		}]
	}]
}

 

效果:

这里面用到的布局和显示的一些参数,参考Ext学习笔记07 - Window及Window中的布局 就可以了, 都是一样一样一样地。

 

这篇有点儿长了,下篇继续吧。 

 

 

这部分的代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ComboBox in Window</title>
<link type="text/css" rel="stylesheet" href="../../../ext/resources/css/ext-all.css">

<script type="text/javascript" src="../../../ext/adapter/ext/ext-base.js"></script>
<script type="text/javascript" src="../../../ext/ext-all.js"></script>
<script type="text/javascript" src="../../../ext/build/locale/ext-lang-zh_CN.js"></script>

<script type="text/javascript">

	Ext.onReady(function(){
		var _window=new Ext.Window({
			title:"New Person",
			width:500,
			height:320,
			plain:true,
			layout:"form",
			defaultType:"textfield",
			labelWidth:45,
			bodyStyle:"padding-top: 10px; padding-left:10px;",
			defaults:{anchor:"95%"},
			items:[{
				xtype:"panel",
				baseCls:"x-plain",
				layout:"column",
				items:[{
						columnWidth:.5,
						layout:"form",
						defaults:{xtype:"textfield", width:170},
						labelWidth:45,
						baseCls:"x-plain",
						/*bodyStyle:"padding-top: 10px; padding-left:10px;",*/
						items:[
							{fieldLabel:"Name"},
							{
								fieldLabel:"Gender",
								xtype:"combo",
								/* 显示 data 的 field 名称 */
								displayField:"gender",
								/* 从本地加载数据 */
								mode:"local",
								/* 显示所有结果 */
								triggerAction:"all",
								readOnly:true,
								store:new Ext.data.SimpleStore({
											/* 定义 dataStore 名称 */
											fields:["gender"],
											/* 定义 data 内容 */
											data:[["Male"],["Female"]]
										})
							},
							{
								fieldLabel:"Age",
								value:"25",
								readOnly:true
							},
							{
								xtype:"datefield",
								format:"Y-m-d",
								value:"1984-12-03",
								readOnly:true,
								fieldLabel:"Birth",
								listeners:{
									"blur":function(_df){
										var _age = _df.ownerCt.findByType("textfield")[2];
										_age.setValue(new Date().getFullYear() - _df.getValue().getFullYear());
									}
								}
							},
							{fieldLabel:"Phone"},
							{fieldLabel:"Email"}
						]
					},
					{
						columnWidth:.5,
						layout:"form",
						style:"padding:10px 10px 0 10px",
						labelWidth:45,
						baseCls:"x-plain",
						items:[
							{
								xtype:"textfield", 
								inputType:"image",
								width:150,
								height:140,
								fieldLabel:"Photo"
							}
						]
					}
				]
			},{
				fieldLabel:"ID",
				width:"400"
			},{
				fieldLabel:"Address",
				width:"400"
			},{
				xtype:"panel",
				layout:"column",
				baseCls:"x-plaint",
				items:[{
					columnWidth:.5,
					layout:"form",
					labelWidth:45,
					baseCls:"x-plaint",
					items:[{
						fieldLabel:"Depart",
						xtype:"combo",
						anchor:"100%",
						displayField:"depart",
						mode:"local",
						triggerAction:"all",
						store: new Ext.data.SimpleStore({
									fields:["depart"],
									data:[["Sale"],["Development"],["Management"],["Other"]]
								})
					}]
				},{
					columnWidth:.5,
					layout:"form",
					baseCls:"x-plaint",
					bodyStyle:"padding-left: 10px",
					items:[{
						xtype:"button",
						text:"Add Depart"
					}]
				}]
			}],
			showLock:false,		
			listeners:{
				"show":function(_window){
							if(!_window["showLock"]){
								_window.findByType("textfield")[4].getEl().dom.src = "../../../image/default_pic.gif";
								_window["showLock"]=true;				
							}
							
							var _depart = _window.findByType("combo")[1];
							var _store = _depart.store;
							_depart.setValue(_store.getAt(0).get("depart"));
						 }
			},
			buttons:[
				{
					text:"OK",
					handler:function(){
						alert(this.ownerCt.buttons[1].text);
					}
				},
				{text:"Cancel"}
			]
		});
		_window.show();
	});

</script>
</head>
<body>

</body>
</html>

 

 

Ext学习笔记01 - NameSpace,类实例属性,类实例方法,类静态方法

Ext学习笔记02 - 构造方法,类继承,类实例方法重写

Ext学习笔记03 - 事件

Ext学习笔记04 - UI组件 - Component, Button

Ext学习笔记05 - UI组件 - Panel,TextField

Ext学习笔记06 - Window

Ext学习笔记07 - Window及Window中的布局

Ext学习笔记08 - 日期控件

Ext学习笔记09 - ComboBox

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 1.1 KB
  • 大小: 39.4 KB
  • 大小: 11.2 KB
  • 大小: 4.5 KB
  • 大小: 5.3 KB
  • 大小: 4 KB
  • 大小: 3.5 KB
  • 大小: 5.3 KB
  • 大小: 4.4 KB
  • 大小: 6.2 KB
分享到:
评论
4 楼 debora 2010-08-06  
如果想从数据库动态加载SimpleStore里的数据,那该怎么办呢?
我用url代替data,但只能把我拼好的每个数据的首写字母显示出来,这是为什么呢?
3 楼 lxj19860114 2010-04-01  
楼主,有个问题想请教一下,有什么办法可以把fieldlabel放到combo的上面而不是左边呢?多谢啦!
2 楼 xiaozhi7616 2009-11-22  
hexawing 写道
LZ加油,写得不错,后面的还有么?

最近太忙了,可能要过一段时间才能继续啦
1 楼 hexawing 2009-11-21  
LZ加油,写得不错,后面的还有么?

相关推荐

    easyui-textbox和easyui-combobox的onchange事件响应实例

    在前端开发中,EasyUI 是一个基于 ...通过学习和理解这个实例,开发者可以更好地掌握 EasyUI 中的 `easyui-textbox` 和 `easyui-combobox` 的使用,以及如何处理 `onchange` 事件,从而提升项目开发的效率和质量。

    jquery.ajax-combobox, jQuery插件,创建一个文本框,可以以自动完成并下拉选择.zip

    jquery.ajax-combobox, jQuery插件,创建一个文本框,可以以自动完成并下拉选择 jquery.ajax-combobox 可以自动完成和pull-down-select的文本框的jQuery插件。 演示http://www.usamimi.info/~sutara/ajax-combobox

    前端项目-bootstrap-combobox.zip

    然后,你需要引入Combobox的CSS和JS文件,通常它们位于`bootstrap-combobox-master/dist`目录下。接着,对HTML元素应用`combobox`类,并通过`data-toggle="combobox"`属性激活插件功能。例如: ```html ...

    Extjs学习笔记(-):ComboBox联动

    本篇学习笔记将深入探讨EXTJS中ComboBox的联动效果,即一个ComboBox的选择会触发另一个ComboBox的数据更新,以此来提供更丰富的交互体验。通过源码解析和工具应用,我们将了解如何构建和实现这种联动效果。 ...

    X-COMBOBOX

    **X-COMBOBOX:深度解析与应用** 在软件开发中,用户界面的设计至关重要,而控件的选择和使用则是界面设计的关键元素。X-COMBOBOX是一款被广泛应用于Windows应用程序中的高效、易用的组合框控件,它不仅具备基本的...

    在easyui-combobox多选模式下加入选择所有选项

    本文将深入探讨如何在EasyUI的Combobox组件中实现多选模式,并添加“选择所有”选项的功能。 Combobox是EasyUI中的一个下拉框组件,它结合了输入框和下拉列表的优点,常用于数据筛选或选择操作。在单选模式下,用户...

    jquery-combobox2Demo

    jquery-combobox2Demo 网上都有的例子保存在这里方面下载

    easyui-combobox、combotree后台数据数据组装与前台绑定实例

    EasyUI 是一个基于 jQuery 的 UI 插件库,它提供了丰富的界面组件,包括我们这里讨论的 Combobox 和 Combotree。这两个组件都是用于在前端展示下拉选择框,但 Combotree 还增加了树形结构的功能,使得用户可以选择树...

    combobox 下拉多选框带搜索功能

    在IT行业中,组合框(ComboBox)是一种常见的UI控件,它结合了文本输入框和下拉列表的功能,用户可以在输入框中输入文字,或者通过下拉列表选择合适的选项。在这个特定的话题“Combobox 下拉多选框带搜索功能”中,...

    Extjs4---combobox省市区三级联动+struts2

    - 通过`Ext.create('Ext.panel.Panel')`创建了一个面板容器,里面包含了三个`combobox`组件,分别用于显示省份、城市和区县的信息。 - 每个`combobox`都有其特定的属性设置,例如`displayField`、`valueField`等,...

    jquery-combobox完美版,修复默认选择,滚动后无法关闭等问题

    《jQuery Combobox优化详解:解决默认选择与滚动后无法关闭问题》 在Web开发中,jQuery Combobox是一款常用的UI组件,它将下拉列表和文本输入框结合在一起,提供了更友好的用户交互体验。然而,实际应用中可能会...

    jquery-simple-combobox, 一个jQuery组合框( selectbox ) 插件.zip

    jquery-simple-combobox, 一个jQuery组合框( selectbox ) 插件 jQuery简单组合插件插件一个 jQuery combobox插件你可以将它用于自动完成( 搜索等) 。用法你可以在 index.html 中找到引用,并在这里查看 fiddles,以...

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

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

    ext-----多选下拉框

    你可以通过设置`store`属性来指定下拉列表的数据源,通常是一个`Ext.data.Store`对象,包含一组记录。`displayField`属性定义了在下拉列表中显示的字段。 2. **多选配置**: 要将`ComboBox`转换为多选下拉框,你需要...

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

    本知识点主要聚焦于如何在Ext4.0框架下动态修改ComboBox的选择项,特别是在本地模式下进行操作。Ext4.0是Sencha Ext JS的一个版本,它提供了一个强大的JavaScript组件库,用于构建富客户端应用程序。 首先,...

    Ajax-chained-combobox.zip

    Ajax-chained-combobox.zip,带有laravel和vuejs的简单链式组合框,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载...

    Ext->editgrid+combobox

    Ext中的Combobox下来框在EditGrid中的应用。Combobox显示值问题得以解决。

    EXT 实现省份--城市--地区--级连

    接着,我们可以使用EXT的`ComboBox`组件来创建下拉框,并设置其`store`属性为对应的Store。为了实现级联,我们需要在省份选择改变时,根据选定的省份ID筛选城市的数据,然后更新城市选择的Store: ```javascript ...

    ext combobox二级联动

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

Global site tag (gtag.js) - Google Analytics