`

ExtJs之数据和ComboBox控件

阅读更多

 

一、如何获取数据

在ExtJs中获取数据主要靠下面四个类: Ext.data.DataProxy、Ext.data.Record、Ext.data.DataReader、Store。下面对这三个类做个简单的介绍。

 

 

DataProxy:获取想要的数据。通过他能得到来自不同地方的数据,如数组、远程服务器,并组织成不同的格式。

 

 

DataReader:定义数据项的逻辑结构,一个数据项有很多列,每列的名称是什么,分别是什么数据类型,都由该类来定义。另外,还负责对不同格式的数据进行读取和解析。在这里用到了Ext.data.Record类来定义具体的列类型。

 

Store:存储器,用于整合Proxy和Reader,控件索取数据时通常和他打交道。

 

 

 

二、Ext.data.DataProxy 类

proxy是代理的意思,很多时候,聪明的架构师和设计者为了屏蔽底层的差异,给用户提供一个统一的访问接口,会设计一个名为“proxy”的类。这种设计哲学在架构中普通应用,并且解决了很多实际问题,代码也变得更加优雅,并有效降低代码侵入。

Ext.data. DataProxy就是来源于这样一种灵感。

Ext.data.DataProxy 是获取数据的代理,数据可能来自于内存,可能来自于同一域的远程服务器数据,更有可能来自于不同域的远程服务器数据。

 

 

 

但是,在实际应用中,我们不会直接使用Ext.data.DataProxy,而是使用他的子类:MemoryProxy、HttpProxy和ScriptTagProxy,他们的作用分别是:

MemoryProxy:获取来自内存的数据,可以是数组、json或者xml。

HttpProxy:使用HTTP协议通过ajax 从远程服务器获取数据的代理,需要指定url。

ScriptTagProxy:功能和HttpProxy一样,但支持跨域获取数据,只是实现时有点偷鸡摸狗。

 

 

 

因为数据最终要显示在ComboBox 中,所以我们以ComboBox 为中心进行设计。大家应该知道,下拉列表框有两个值,一个是显示值,另一个是实际值,也就是说,一个数据项包含两列:显示值列和实际值列。我们定义一个用来保存城市名称的二维数组:

 

 

var cities = [["1", "沈阳"], ["2", "大连"], ["3", "鞍山"], ["4", "辽阳"]];

在二维数组中,每一个城市保存了两个值:值一表示城市编号,作为实际值,值二表示城市名称,作为显示值。然后,我们将data 构建出一个MemoryProxy对象:

 

 

var mp = new Ext.data.MemoryProxy(cities);

 

 

 

三、Ext.data.DataReader 类

 

DataReader 从来不是单独行动的,他没有太多的自主权,总是看DataProxy行事。总体来说,DataReader 用来定义数据项(行)的逻辑结构,主要信息有:列的逻辑名称(name)、列的数据类型(type)、列与数据源的索引映射(mapping)等,另外,还包含一些元数据,如分页信息。

实际上,每一个数据项都是一个Ext.data.Record(记录)对象,而数据项的列信息则是通过Ext.data.Record来定义的。Ext.data.Record并没有固定的结构,他保存的是一个json对象数组,数组的元素个数由列的数量来决定。在上面的例子中,城市包含ID 和名称,所以,必须在数组中定义两个元素,基本就是这个样子:

 

 

	var myRecord = Ext.data.Record.create([{
				name : 'cid',
				type : 'int',
				mapping : 0
			}, {
				name : 'cname',
				type : 'string',
				mapping : 1
			}]);

我们定义了一个myRecord的结构,通过Ext.data.Record.create创建,参数是一个json对象数组,name 和type 分别表示每一列的名称和数据类型,mapping 是列值与数组元素的映射关系。 

 

 

Record 创建好后,必须和DataReader 关联,DataReader 也同样有三个子类:Ext.data.ArrayReader、Ext.data.JsonReader、Ext.data.XmlReader。我之前说过DataReader 从来不单独行动,使用哪一个子类主要取决于DataProxy中封装的数据类型,如果是数组,则使用Ext.data.ArrayReader;如果是json,则使用Ext.data.JsonReader;如果是xml,则使用Ext.data.XmlReader。

 

在本例中,我们处理的数据类型是数组,所以自然要使用ArrayReader。

 

var myReader = new Ext.data.ArrayReader({}, myRecord);

构造ArrayReader 对象时,构造函数的第一个参数就是元数据,第二个参数则是Record。也可以一步到位: 

 

 

var myReader = new Ext.data.ArrayReader({}, [
{name: "cid", type: "int", mapping: 0},
{name: "cname", type: "string", mapping: 1}
]);

 

 

四、Ext.data.Store 类

这个类相对简单,不需要面对数据和结构,只是把DataProxy和DataReader 整合在一起,这样一来,数据有了,结构有了,俨然就是一张数据表,想一想数据库中的物理表是不是就是这样的呢?嗯,非常像。

典型的写法像这样:

var store = new Ext.data.Store({
    proxy: proxy,
    reader: reader
});

到了这一步,别以为大功告成了,其实这时候数据并没有加载到Store中,默认情况下,Store采取延时加载,必须显式调用load()方法,当然,我们也可以采取即时加载策略,按如下配置即可: 

var store = new Ext.data.Store({
    proxy: proxy,
    reader: reader,
    autoLoad: true //即时加载数据
});

我们画张图,用来描述这三个类之间的关系。


可以看出,Ext.data.Store的主要目的是在内存中建立一张数据表,填充到组件中,这些组件形态也千差万别,最典型的就是ComboBox 和GridPanel。

 

 

五、下拉列表框

下拉列表框被定义成ComboBox 类,位于Ext.form命名空间,和Button不同,他是一个表单域组件,常用于表单中。

我们有一个这样的ComboBox,该组件用来显示辽宁的城市。


看起来和select标记别无二致,只是更加漂亮了。  

 

一起来熟悉一个比较典型的ComboBox的定义方法:

var combobox = new Ext.form.ComboBox({
			renderTo : Ext.getBody(),
			triggerAction : "all",
			store : store,
			displayField : "cname",
			valueField : "cid",
			mode : "local",
			emptyText : "请选择辽宁城市"
		});

嘿嘿,如果不解释您一定会愣上半天,有时候真不习惯Extjs中属性名称的定义风格,也许只怪我们的头发太长见识太少,来认识一下吧。

triggerAction:是否开启自动查询的功能,为all表示不开启,为query表示开启,默认为query;

store:不用解释了,和前面的Ext.data.Store对象挂勾,定义数据源;

displayField:关联Record的某一个逻辑列名作为显示值,本例为城市名称;

valueField:关联Record的某一个逻辑列名作为实际值,本例为城市ID;

mode:可选值有local和remote,如果数据来自本地,用local,如果数据来自远程服务器,必须用remote,默认为remote;

emptyText:没有选择任何选项的情况文本框中的默认文字。

 

请理解并记住这个基本的用法,很多东西都是这样巩固消化的。当我们面对如海水般涌来的信息,第一感觉就是无所适从,继而惊惶失措,夺路而逃,于是被永远挡在真理的大门之外。成功和失败,只在一念之间。

抓住核心点之后,慢慢扩展,知识架构便会越来越丰满,因为把握好了整个知识点的精髓,再怎么变化,都不至于迷路。 

 

六、得到下拉列表框的值

下拉列表框(ComboBox)有两个值,显示值和实际值。显示值为用户提供了更为直观和理想的体验,而实际值则会传送到服务器,供服务器处理。

ComboBox定义了两个方法,其中,getValue()用于返回实际值,getRawValue()用于返回显示值。

我在页面上放置了一个按钮,点击按钮显示下拉列表框的值:

var btn = new Ext.Button({
			text : "列表框的值",
			renderTo : Ext.getBody(),
			handler : function() {
				Ext.Msg.alert("值", "实际值:" + combobox.getValue() + ";显示值:"
								+ combobox.getRawValue());
			}
		});

 

七、源代码

下面是本章示例的源程序:

Ext.onReady(function() {
			cmp();
		});

var cmp = function() {
	// 1. 定义本地静态数据
	var cities = [["1", "沈阳"], ["2", "大连"], ["3", "鞍山"], ["4", "辽阳"]];
	// 2. 根据数据定义内存代理
	var mp = new Ext.data.MemoryProxy(cities);
	// 3. 创建记录格式
	var myRecord = Ext.data.Record.create([{
				name : 'cid',
				type : 'int',
				mapping : 0
			}, {
				name : 'cname',
				type : 'string',
				mapping : 1
			}]);
	// 4.把数据按照创建的记录格式进行组合
	var myReader = new Ext.data.ArrayReader(mp, myRecord);
	//var reader = new Ext.data.ArrayReader({}, myRecord);
	
	// 5.把数据按照一定格式组成的数据组传入缓存
	var myStore = new Ext.data.Store({
				proxy : mp,
				reader : myReader,
				autoLoad : true
			});
	// store.load(); 如果在Store配置信息中使用autoLoad:true,就可以不用此方法.
	// 5.创建下拉列表,把数组写入下接列表
	var myCb = new Ext.form.ComboBox({
				id : "myCb1",
				store : myStore,
				title : "辽宁省下属市",
				emptyText : "辽宁省下属市",
				displayField : "cname",
				valueField : "cid",
				triggerAction : "all",
				mode : "local",
				renderTo : Ext.getBody()
			});
	// 6.创建按钮,实现读取下拉列表
	var myBtn = new Ext.Button({
				id : "myBtn1",
				type : "button",
				text : "所选城市",
				renderTo : Ext.getBody(),
				handler : function() {
					if (myCb.getValue() == "") {
						Ext.Msg.alert("提示","请做出选择");
						myCb.focus(true);
					} else {
						Ext.Msg.alert("值", "实际值:" + myCb.getValue() + ";显示值:"
										+ myCb.getRawValue());
					}
				}
			});
}

 

 

 

 

  • 大小: 52.4 KB
  • 大小: 4.9 KB
1
0
分享到:
评论
2 楼 baseball 2014-08-07  
您好:
謝謝您分享,請問您是用EXTJS 哪一版?
但 我使用 Extjs 4.2
參考您的 CODE,但 chrome console 中結果卻顯示
Uncaught TypeError: Cannot read property 'items' of undefined

請問 這該如何處理呢?
Ext.onReady(function(){
  var cities = [["1", "瀋陽"], ["2", "大連"], ["3", "安山"], ["4", "寮楊"]];
  var mp = new Ext.data.MemoryProxy(cities);
  
  var myRecord = Ext.data.Record.create([
                   {name : 'cid',type : 'int',mapping : 0	},
                   {name : 'cname',type : 'string',mapping : 1}
                 ]);
                   

                   
   var myReader = new Ext.data.ArrayReader({}, myRecord);        
   
   var store = new Ext.data.Store({
    proxy: mp,
    reader: myReader
   });
       
   console.log(store.getCount());          
});

1 楼 tangduDream 2013-03-04  
extjs 喔喔喔

相关推荐

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

    `GridComboBox` 结合了 `ComboBox` 和 `GridPanel` 的特性,允许用户在一个下拉菜单中浏览和选择多行数据。 1. **Extjs4 的 ComboBox** - `ComboBox` 是EXTJS中的一个基础组件,它提供了文本输入框和下拉列表的...

    在combobox控件中添加图标

    首先在窗体中添加一个comboBox1和一个imageList(本例中带有三个图片) this.comboBox1.DrawMode = System.Windows.Forms.DrawMode.OwnerDrawFixed;

    Extjs6中Combobox实现下拉多选

    该资源主要展示了在Extjs6中Combobox控件实现下拉选择多个数据的功能

    Extjs6 日期时间控件

    在EXTJS6中,日期时间控件是一种强大的用户界面组件,它将传统的日期选择器与时间选择器结合在一起,提供了一种便捷的方式来输入和编辑日期和时间数据。这个控件在许多应用程序中都非常实用,特别是在那些需要精确...

    extjs网页控件开发

    在ExtJS中,这通常通过组合框(ComboBox)组件和数据存储(Store)配合实现。每个级别的下拉框都有自己的Store,当上一级选择改变时,可以通过监听事件并更新Store来刷新下拉列表内容。 开发这样的控件需要掌握以下...

    ExtJS下拉列表树控件

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

    模仿extjs风格写的jquery combobox

    标题中的“模仿extjs风格写的jquery combobox”指的是一个基于jQuery的下拉选择框组件,它的设计灵感来源于ExtJS库的ComboBox控件。ExtJS是一款功能丰富的JavaScript框架,以其强大的组件化和数据绑定机制著名,而...

    extjs 5 combogrid控件

    Combogrid控件结合了combobox(下拉框)和grid(数据网格)的优点,用户可以在输入框内搜索关键字,同时在下拉区域看到匹配的数据列表,列表以表格的形式展示,便于用户快速浏览和选择。 在ExtJS 5中,Combogrid...

    extjs4.2 datetime控件

    7. **组合框(ComboBox)集成**:DateTime控件可能基于ExtJS的ComboBox组件构建,允许用户通过下拉菜单选择日期和时间,同时提供输入框供用户手动输入。 8. **验证**:控件通常包含内置的验证功能,以确保用户输入...

    ExtJs搜索控件、插件

    在ExtJS中,搜索控件和插件是提升用户体验、实现高效数据查找的关键元素。本篇将深入探讨这些知识点,以帮助你更好地理解和应用。 首先,我们要了解`SearchField.js`在这个上下文中的作用。通常,这是一个自定义...

    ExtJS Combobox二级联动列子

    ExtJS的Combobox组件是一种常见的数据输入控件,它提供了下拉列表的功能,用户可以选择列表中的一个选项或者在输入框中自由输入。在实际应用中,我们常常会遇到需要实现二级甚至多级联动的场景,这通常是由于数据的...

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

    它提供了一套丰富的组件,包括各种类型的输入控件,如ComboBox。在给定的标题“Ext ComboBox 下拉多选框带搜索功能”中,我们关注的是一个特别的ComboBox实现,它不仅允许用户从下拉列表中选择多个选项,还具备搜索...

    Extjs之--带分页的lovcombo控件

    本篇我们将聚焦于ExtJS中的一个特定控件——带分页的LOV(Look Up Value)Combo,它结合了Combobox和分页功能,方便用户在大量的数据中选择值。 LOV Combo(Look Up Value ComboBox)是ExtJS中的一种复合控件,它的...

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

    - `combobox`(组合框)是Extjs框架中一种常用的UI控件,用于展示下拉列表供用户选择。 - 在本例中,combobox被用来实现省市区的选择功能,即用户选择省份后自动加载对应的城市列表,选择城市后再加载对应的区县...

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

    在EXTJS这个强大的JavaScript框架中,ComboBox控件是一种常用的组件,它用于实现下拉选择框的功能。本篇学习笔记将深入探讨EXTJS中ComboBox的联动效果,即一个ComboBox的选择会触发另一个ComboBox的数据更新,以此来...

    combobox实现下拉框多选

    本方法和用checkbox, listbox等控件和事件拼凑出来的不同,本方法是一个集成的独立控件,基本实现了控件的顺滑度,下拉框可悬浮等效果,可以认为是comboBox的升级版,使用方便,仅需引用编译好的DLL,直接在toolBox...

    ExtJS下拉列表树控件1

    4. 创建ComboBox:创建一个ComboBox控件,配置它的store、displayField(用于显示的字段)以及valueField(用于保存选中值的字段)。 5. 自定义模板:由于ComboBox默认不支持树形结构,所以需要自定义一个模板,使...

    Extjs之旅-combox之远程加载数据

    本篇我们将深入探讨“Extjs之旅”中的一个关键组件——Combox(组合框),特别是其远程加载数据的特性。 Combox在ExtJS中是一个非常灵活的控件,它可以看作是下拉列表和文本输入框的结合体,用户可以输入文本搜索,...

    Extjs6 下拉列表

    综上所述,ExtJS6的下拉列表(ComboBox)和GridCombo扩展控件提供了强大的功能和灵活性,它们可以用于创建丰富的用户界面,满足各种复杂的业务需求。理解和熟练掌握这些组件的使用,对于开发高质量的Web应用至关重要...

Global site tag (gtag.js) - Google Analytics