zoukankan      html  css  js  c++  java
  • Extjs的ComboBox控件

    继续学习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,//选择的时候鼠标滑过变化 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>'),

  • 相关阅读:
    C++ 的查漏补缺
    Model元数据解析
    Controller
    路由
    win8系统 Reflect 破解
    MVC运行原理
    源代码Log
    linq 分类
    EF 实体关系
    第二十六章 计算限制的异步操作
  • 原文地址:https://www.cnblogs.com/jzwh/p/3085939.html
Copyright © 2011-2022 走看看