君子王焕

博客园 首页 新随笔 联系 订阅 管理

继续学习comboBox控件,重点的是控件的定义,store的读取,和控件的扩展。

1、控件的定义及属性,

 var projectProjectType = [
['985', '985工程', ''],
['211', '211工程', '']
];
this._projectProjectType = new Ext.form.ComboBox({
store: projectProjectType,//二维数组的数据源,第一个值表示value,第二个值表示显示的text,其余忽略;如果用一维数组则值同时赋给value和text;
displayField: 'lb',//显示的值域就text
fieldLabel: '所属工程',
value: project.get('typeName'),//开始调用时如有需要,自动赋值
triggerAction: 'all',//请设置为”all”,否则默认 为”query”的情况下,你选择某个值后,再此下拉时,只出现匹配选项,如果设为”all”的话,
每次下拉均显示全部选项 typeAhead: true,//延时查询,与下面的参数配合
typeAheadDelay:250,//默认250 mode: 'local',//获取js本地数据也就是javascript(内存)中的数据,即上面定义的那个projectProjectType emptyText: '请选择工程', selectOnFocus: true,//选择的时候鼠标滑过变化 width: 90,//整个框的宽度 listWidth: 90//下拉列表的宽度 });

combo这个控件是需要绑定一个Store数据源才能使用的,因此,在数据绑定中 combo需要指定两个比较关键的属性displayField和valueFielddisplayField指定一个Store的某一个列 名,也就是Store的fields指定的内容而valueField,则是实际combo返回的值,displayField是指示显示的,如 果valueField不指定也行,不过返回值就成了displayField。

2、一种动态XmlStore的读取方法

 this._projectContentType = new Vpms.component.EntityComboBox({
fieldLabel: '所属工程',
store: new Vpms.projects.ProjectContentTypeStore(Ipms.service.projects.ProjectService + '/GetForType', {}),
});

通过构造的Store将后台读取过来的XML数据解析,之后按照相应字段显示出来

store的构造如下:

Vpms.projects.ProjectType = Ext.data.Record.create([{
name: 'id',
type: 'int',
mapping: 'ID'
}, {
name: 'value',
type: 'string',
mapping: 'Value'
}]);
Ipms.data.Entity.apply(Vpms.projects.ProjectType);//定义store的record,包含两个字段id和value;

Vpms.projects.ProjectContentTypeXmlReader = Ext.extend(Vpms.data.XmlReader, {
constructor: function () {
Vpms.projects.ProjectContentTypeXmlReader.superclass.constructor.call(this, Vpms.projects.ProjectType);
}
});//定义XmlReader,用来读取并解析后台传过来的数据,这里扩展的是自定义的一个data.XmlReader解析器,对Ext.data.XmlReader的扩展,更方便的读取需要的数据;


Vpms.projects.ProjectContentTypeStore = Ext.extend(Vpms.data.XmlStore, {
constructor: function (load_url, params) {
Ipms.projects.ProjectContentTypeStore.superclass.constructor.call(this, new Vpms.projects.ProjectContentTypeXmlReader(), load_url, 
params); } });
//这个store也是对自定义的一个data.XmlStore的扩展,而自定义xmlStore是对Ext.data.store的扩展,并使用以上定义的数据解析器进行xml数据格式的解析,
在用这种store的时候应该注意,后台传过来的是xml格式的数据。

Ext.extend()函数提供了直接访问父类构造函数的途径,通过 SubClass.superclass.constructor.call(this);就可以直接调用父类的构造函数,这个函数的第一个参数总是 this,以确保父类的构造函数在子类的作用域里工作。

如果父类的构造函数需要传入参数,可以讲所需的参数直接传递给它: SubClass.superclass.constructor.call(this,config);这样就得到了一个继承了父类的所有属性和函数的子类。

在点击下拉列表时,调用后台函数获取数据,如下面的params.store.on('load', function (store, records) 。

3、控件的扩展:EntityComboBox和EntitySearch.SearchComboBox,前一种与以上的store结合起来显示的状态为正常的comboBox,而后一种的形状有点不同,看起来很像textField,但是用起来跟comboBox是一样的。

3.1、EntityComboBox

Vpms.component.EntityComboBox = function (params) {//params指的是传进来的当前的comboBox,以下的params.后面的东西就是设置的当前的comboBox的属性;

this.selectEntityId = params.entityId;

params.valueFiled = 'id';
params.lazyInit = false;
params.triggerAction = 'all';
params.forceSelection = true;
params.store.comboBox = this;

Vpms.component.EntityComboBox.superclass.constructor.call(this, params);
params.store.on('load', function (store, records) {//load时加载数据,如果没有记录,设置comboBox为不可编辑状态;
if (records.length == 0)
store.comboBox.disable();
});
}

Ext.extend(Vpms.component.EntityComboBox, Ext.form.ComboBox, {//第一个参数是子类,第二个是父类
onSelect: function (record) {
this.selectEntityId = record.get('id');
Vpms.component.EntityComboBox.superclass.onSelect.call(this, record);
},
getValue: function () {
return Vpms.component.EntityComboBox.superclass.getValue.call(this) != '' ? this.selectEntityId : undefined;
},
getText: function () {
return Vpms.component.EntityComboBox.superclass.getValue.call(this)
},
getEntity: function () {
var selectId = this.getValue();
if (selectId == undefined)
return undefined;

return this.store.getById(selectId);//getById是store里边的用法,表示取得相应id的记录;
},
setSelectEntityId: function (value) {
this.selectEntityId = value;
}
});

Ext.extend(subclass, superclass, [overrides]) 用来继承已有的类,则以上的onSelect、getValue、getText、getEntity和setSelectEntityId
是对父类的override。override属性 类级别的 区别前面 只有一个参数的 是实例级别的

 

自定义的

3.2、EntitySearch.SearchComboBox

图片显示的就是EntitySearch.SearchComboBox的外形,显示的文字是通过自己定义

new Ext.ToolTip({
target: this.getId(),
html: '您可以通过输入用户<span style="color: Red;">姓名</span>或者<span style="color: Red;">拼音缩写</span>查找并选择用户'
});

这种实现方式类似textfield的validator事件,当填写相应的内容时,会自动将填写的内容发送到后台获取对应的records;

而显示的时候,同样的与EntityComboBox一样定义自己的record、store、reader,无论什么方式,最后都继承自Ext.form.ComboBox,然后通过以下这种方式显示需要的字段就可以了。

tpl: new Ext.XTemplate('<tpl for="."><div class="search-item" style="padding: 1px">', '{name}({expertNumber}):{college1},{college2}', '</div></tpl>'),

posted on 2013-05-18 19:30  君子王焕  阅读(1148)  评论(0编辑  收藏  举报