引入扩展文件

Extjs4.2根目录下:

examples \ ux \ css \ images (这是选择按钮的图片资源)
examples \ ux \ css \ ItemSelector.css
examples \ ux \ form \ MultiSelect.js
examples \ ux \ form \ ItemSelector.js

我是将以上文件取出来打包到我项目中自己创建的ux目录,没有全部使用ExtJs的包,然后引入以上文件:

<script src="/ExtJs/ux/MultiSelect.js"></script>
<script src="/ExtJs/ux/ItemSelector.js"></script>   
<link  href="/ExtJs/ux/css/ItemSelector.css" rel="stylesheet" />
{
    xtype: "fieldset",
    title: "选择仓库管理员",
    columnWidth: .100,
    style: "padding:10px;",
    items: [
        {
            xtype: "panel",
            layout: "fit",
            cls: "panelBoder",
            height:,
            items: [
                {
                    xtype: 'itemselector',
                    anchor: '100%',
                    id: 'UserManagerItemselector',
                    style:"margin-bottom:10px;",
                    //fieldLabel: 'ItemSelector',
                    imagePath: '/ExtJs/ux/css/images/', //这是选择按钮的图片资源
                    store: "UserManagerStore",
                    displayField: 'UserName',
                    valueField: 'UserId',
                    //value: ['3', '4', '6'], //默认选中项
                    allowBlank: false,
                    blankText: "必须选择至少一项",
                    msgTarget: "title",
                    fromTitle: '可选', //左边的选择框
                    toTitle: '已选' //右边的选择框            
                }
            ],                        
            bbar: [
                {
                    xtype: "pagingtoolbar",
                    store: "UserManagerStore",
                    displayInfo: true,//是否显示分页的额外信息
                    displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',//displayInfo为true时,此属性才能生效
                    emptyMsg: "没有记录",
                    listeners: {
                        beforechange: function () {
                            var cmp = Ext.getCmp("UserManagerItemselector");
                            var selectedRecords = cmp.toField.store.getRange();                                         
                            if (!window.UserManagerItemselectorOldVal) { window.UserManagerItemselectorOldVal = [] };//将翻页前已经选中的记录存入临时的全局变量中 
                            window.UserManagerItemselectorOldVal = selectedRecords;                                          
                            cmp.fromField.store.removeAll(); //清空左侧选择框所对应的存储器存储的全部数据以便点击下一页时左侧选择框可以重新加载新数据而不是默认的追加新数据
                            //Ext.getCmp("UserManagerItemselector").clearValue(); //清空已经选择好的项
                            //Ext.getCmp("UserManagerItemselector").toField.store.removeAll(); //直接清空右侧选择框中所对应的存储器存储的全部数据,这个存储器是隐藏的
                                           
                        }
                    }
                },
                {
                    xtype: "panel",
                    items: [
                        {
                            xtype: "button", text: "撤回", style: "background:red;border:none;margin:10px 0;", icon: "../img/ico/expand-down.png", handler: function () {
                                var cmp = Ext.getCmp("UserManagerItemselector");
                                var oldVal = window.UserManagerItemselectorOldVal;
                                if (oldVal) {
                                    cmp.getStore().add(oldVal);
                                    window.UserManagerItemselectorOldVal = null;
                                }
                                cmp.clearValue();
                            }
                        }
                    ],
                }
            ]
        }
    ]                    
} /*提交表单取多选框的值*/
buttons: [
    { 
        text: '仓库信息登记', 
        handler: function () {
            var cmp = Ext.getCmp("UserManagerItemselector");
            var StockUserIDs = cmp.getValue(); //选中的值
            //无值则将多选框的边框描红 自行设置panelRedBoder的css
            if (StockUserIDs.length == ) {
                cmp.up("panel").addCls("panelRedBoder");
            }
            else {
                cmp.up("panel").removeCls("panelRedBoder");
            }
            if (!form.isValid()) { return; }
            StockUserIDs=StockUserIDs.join(",") 
            //……
        }
    }                   
]

选择框边框样式

<style>
    #DrugsErpCompanyItemselector {  border: 1px solid #B5B8C8; }
    #DrugsErpCompanyItemselector .x-boundlist { /*background: #DFEAF2;*/}
    #DrugsErpCompanyItemselector * {  border: none; }
    .panelBoder * {  border: none; }
    .panelRedBoder { border: 1px solid red; }
</style>

在GridPanel列编辑状态下的Itemselector

比如在上面的表格中双击某个列,要对该列记录进行编辑,这要注意以下几点:

1.如果将Itemselector置于window组件中,因为window的遮罩的缘故,存储器中的数据只能够被访问一次,解决办法是将存储器置于创建window的函数中。

2.通过编辑器的beforeedit事件使用context.record获得当前编辑的记录,然后将该记录插入到Itemselector的存储器中,在Itemselector渲染后再模拟Itemselector的add select按钮的方法将记录从左侧移动到右侧

3.该列的数据存储器去服务端拿数据的时候要排除当前列(比如张飞、刘备)的ID,这样当前列的数据就只会出现在右侧(已选择)的框中,属于默认选中项。

4.因为从服务端取数据的时候排除了当前列的数据的ID,所以假如右侧的默认选中项丢失了,还得将它们找回来,比如定义一个还原的按钮,用户点击后随时可以还原默认选中项。

5.双击张飞、刘备一列,会弹出window,这列里有两个数据,他们有各自的ID,而这两个ID是一个数组,通过查询表格数据的时候该行记录对应的多个管理员的ID放入了数组中。模型如下:

// #region 仓库数据模型
Ext.define("StockTableModel", {
    extend: "Ext.data.Model",
    fields: [
        { name: "StockTableId", type: "int" },
        { name: "StockName", type: "string" },
        { name: "CompanyName", type: "string" },
        { name: "StockAddress", type: "string" },
        { name: "UserIDs", type: "auto" }, //仓库管理员名称存储在数组中
        { name: "UserNames", type: "auto" } //仓库管理员ID存储在数组中
    ]
});
// #endregion
GridPanel编辑状态下弹出多选框,读取默认值。打包
//多选框打包
function CreateItemselectorEditWindow(options) {     var windowTitle = options.windowTitle;
    var fieldsetTitle = options.fieldsetTitle;
    var storeId = options.storeId;
    var editRecord = options.editRecord;
    var tableModelFieldText = options.tableModelFieldText;
    var tableModelFieldKey = options.tableModelFieldKey;
    var cellModelFieldText = options.cellModelFieldText;
    var cellModelFieldKey = options.cellModelFieldKey;
    //将当前要编辑的记录取出来存入oldRec
    var oldRecs = [];
    var Keys = editRecord.get(tableModelFieldKey);
    var Texts = editRecord.get(tableModelFieldText);
    for (var i = ; i < Keys.length; i++) {
        var obj = {
            [cellModelFieldKey]: Keys[i],
            [cellModelFieldText]: Texts[i]
        };
        oldRecs.push(obj);
    }     Ext.create("Ext.window.Window", {
        id: "EditWin",
        title: windowTitle,
        autoShow: true,
        forceFit: true,
        width: ,
        style: "border:none;padding:10px;",
        border: false,
        modal: true,
        layout: "anchor",
        items: [
            //创建表单
            Ext.create("Ext.form.Panel", {
                id: "EditForm",
                forceFit: true,
                style: "border:none;padding:10px;",
                border: false,
                items: [
                    {
                        xtype: "fieldset",
                        title: fieldsetTitle,
                        columnWidth: .100,
                        style: "padding:10px;",
                        items: [
                            {
                                xtype: "panel",
                                layout: "fit",
                                cls: "panelBoder",
                                height: ,
                                items: [
                                    {
                                        xtype: 'itemselector',
                                        anchor: '100%',
                                        id: 'xItemSelector',
                                        style: "margin-bottom:10px;",
                                        imagePath: '/ExtJs/ux/css/images/',
                                        store: storeId,
                                        displayField: cellModelFieldText,
                                        valueField: cellModelFieldKey,
                                        allowBlank: false,
                                        blankText: "必须选择至少一项",
                                        msgTarget: "title",
                                        fromTitle: '可选',
                                        toTitle: '已选',
                                        listeners: {
                                            afterrender: function () {
                                                var xItemSelector = Ext.getCmp("xItemSelector");
                                                var store = Ext.getStore(storeId);
                                                store.add(oldRecs);//将当前编辑的记录插入存储器                                                        
                                                var newRecs = store.getNewRecords();//获取刚插入的记录
                                                xItemSelector.bindStore(store);  //刷新数据存储器
                                                xItemSelector.moveRec(true, newRecs); //将参数指定的记录插入到右侧选择框
                                                var selectedRecords = xItemSelector.toField.store.getRange();
                                                if (!window.xItemSelectorOldVal) { window.xItemSelectorOldVal = [] };
                                                window.xItemSelectorOldVal = selectedRecords;
                                                if (!window.xItemSelectorDefaultVal) { window.xItemSelectorDefaultVal = [] };//存储当前编辑的记录,以便还原为默认选中项
                                                window.xItemSelectorDefaultVal = newRecs;
                                            }
                                        }
                                    }
                                ],
                                bbar: [
                                    {
                                        xtype: "pagingtoolbar",
                                        store: storeId,
                                        displayInfo: true,
                                        displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
                                        emptyMsg: "没有记录",
                                        listeners: {
                                            beforechange: function () {
                                                var xItemSelector = Ext.getCmp("xItemSelector");
                                                var selectedRecords = xItemSelector.toField.store.getRange();
                                                if (!window.xItemSelectorOldVal) { window.xItemSelectorOldVal = [] };
                                                window.xItemSelectorOldVal = selectedRecords;
                                                xItemSelector.fromField.store.removeAll();
                                            }
                                        }
                                    },
                                    {
                                        xtype: "panel",                                            
                                        items: [
                                            {
                                                xtype: "button", text: "撤回所选", style: "background:red;border:none;margin:10px 0;", handler: function () {
                                                    var xItemSelector = Ext.getCmp("xItemSelector");
                                                    var oldVal = window.xItemSelectorOldVal;
                                                    if (oldVal) {
                                                        xItemSelector.getStore().add(oldVal);
                                                        window.xItemSelectorOldVal = null;
                                                    }
                                                    xItemSelector.clearValue();
                                                }
                                            },
                                            {
                                                xtype: "button",
                                                text: "还原默认选中项",
                                                style: "background:red;border:none;margin:10px 10px;",                                         
                                                handler: function () {
                                                    var xItemSelector = Ext.getCmp("xItemSelector");
                                                    xItemSelector.fromField.store.removeAll();
                                                    xItemSelector.bindStore(xItemSelector.getStore());
                                                    xItemSelector.getStore().add(window.xItemSelectorDefaultVal);
                                                    xItemSelector.moveRec(true, window.xItemSelectorDefaultVal);//还原默认选择项             
                                                }
                                            }
                                        ],
                                    }
                                ]
                            }
                        ]
                    }
                ],
                buttons: [
                    {
                        text: "确定", handler: function () {
                            var xItemSelector = Ext.getCmp("xItemSelector");
                            var xItemSelectorVal = Ext.getCmp("xItemSelector").getValue();
                            if (xItemSelectorVal.length == ) {
                                xItemSelector.up("panel").addCls("panelRedBoder");
                            }
                            else {
                                xItemSelector.up("panel").removeCls("panelRedBoder");
                            }
                        }
                    }
                ]
            })
        ],
        listeners: {
            beforeclose: function () { //销毁所有组件和存储器
                var store = Ext.getStore(storeId);
                this.destroy();
                Ext.StoreManager.remove(store);
                if (window.xItemSelectorDefaultVal) { window.xItemSelectorDefaultVal = null };
            },
            close: function () { }
        }
    }); }
以下是在Grid表格中编写的列编辑器的双击列事件,将使用上面打包好的CreateItemselectorEditWindow函数创建Itemselector 
plugins: [
    {
        ptype: "cellediting",
        clicksToEdit: ,
        listeners: {
            //编辑某记录时在函数中创建弹出窗口同时定义记录所对应的模型和存储器
            beforeedit: function (editor, context) {
                if (context.colIdx == ) {
                    // #region 员工数据模型
                    Ext.define("UserManagerModel", {
                        extend: "Ext.data.Model",
                        fields: [
                            { name: "UserId", type: "int" },
                            { name: "UserName", type: "string" }
                        ]
                    });
                    // #endregion                     // #region 员工数据存储器
                    Ext.create("Ext.data.Store", {
                        storeId: "UserManagerStore",
                        model: "UserManagerModel",
                        autoLoad: true,
                        pageSize: ,//每页显示5条记录
                        proxy: {
                            type: "ajax",
                            url: "/Ashx/ComboboxHandler.ashx",
                            extraParams: { params: { start: , limit:  }, comboboxType: "userManagerModel", editExcludeID: Ext.encode(context.record.get("UserIDs")) }, //排除当前列数据的ID
                            reader: {
                                type: "json",
                                totalProperty: 'totalProperty', //此为默认,表示记录总数
                                idProperty: 'UserId', //数据模型的主键
                                root: "root"
                            }
                        }
                    });
                    // #endregion                     //创建多选框
                    CreateItemselectorEditWindow({
                        windowTitle: "正在编辑……",
                        fieldsetTitle:"选择仓库管理员",
                        storeId: "UserManagerStore",
                        tableModelFieldText: "UserNames",//GridPanel的Store所绑定的数据模型(DataModel)中的数组(auto)字段,显示在表格列上的多个文本所代表的字段名
                        tableModelFieldKey: "UserIDs",//GridPanel的Store所绑定的数据模型(Model)中的数组(auto)字段,显示在表格列上的多个文本所对应的键的字段名
                        cellModelFieldText: "UserName", //被编辑的列所对应的数据模型(DataModel)中的key
                        cellModelFieldKey: "UserId",//被编辑的列所对应的数据模型(DataModel)中的Value
                        editRecord: context.record
                    });                     return false;
                }
                            
            }
        }
    }
]

demo参看ext包的ext-4.2.1.883\examples\multiselect

selector-ux

Javascript - 学习总目录

Javascript - ExtJs - Itemselector的更多相关文章

  1. Javascript - ExtJs - GridPanel组件

    GridPanel组件(Ext.grid.GridPanel)logogram:Ext.grid.Panel | xtype:gridpanel 此类派生自Ext.Panel,创建表格需要两个必须的对 ...

  2. Javascript - ExtJs - Ext.form.Panel组件

    FormPanel组件(Ext.form.FormPanel) logogram:Ext.form.Panel | xtype:form Ext.form.Panel.配置 frame }//旗下所有 ...

  3. Javascript - ExtJs - 组件 - 分页

    服务端只需要返回如下格式的字符串,ExtJs就可以解析并自动生成分页数据.  , name: "sam" }     ] } 准备: CREATE PROCEDURE [dbo]. ...

  4. Javascript - ExtJs - 整合百度文章编辑器

    ExtJs - 整合百度文章编辑器(ExtJs UEditor) 第一步:去官网下载最新版本的UEditor,UEditor下载. 第二步:在编辑器根目录创建一个Extjs-Editor.js,录入以 ...

  5. Javascript - ExtJs - 事件

    事件(ExtJs Event) Ext.Util.observable类  Ext.Util.observable是一个接口,为Ext组件的事件提供了支持,组件的事件不同于传统事件,所以需要有这么一套 ...

  6. Javascript - ExtJs - 数据

    数据(ExtJs Data) Ext.data命名空间 有关数据存储.读取的类都定义在Ext.data命名空间中.Ext的gridPanel.combobox的数据源都是来自Ext.data提供的类. ...

  7. Javascript - ExtJs - 弹窗

    1.确认对话框 Ext.MessageBox.alert( title,content,fn) Ext.onReady(function () {    Ext.Msg.alert("好吧, ...

  8. Javascript - ExtJs - 常用方法和属性

    常用方法和属性(Common methods and attributes) ExtJs中的对象 Ext.Component Ext组件对象,表示一个可渲染的组件. Ext.dom.Element E ...

  9. [JAVASCRIPT][EXTJS]直接用JSON创建树形控件(Ext.tree.TreePanel )(转)

    直接用JSON创建树形控件(Ext.tree.TreePanel ) 1.创建多个根节点的树形 2.直接使用JsonList创建树形 <!DOCTYPE HTML PUBLIC "-/ ...

随机推荐

  1. 发送HTTP_GET请求 表头application/json

    /** * 发送HTTP_GET请求 * 该方法会自动关闭连接,释放资源 * @param reqURL 请求地址(含参数) * @param decodeCharset 解码字符集,解析响应数据时用 ...

  2. ASP.NET的checkboxlist,RadioButtonList,FileUpload,image控件的综合使用

    一.拖控件 控件拖完如图所示:(有些是对不齐的,加一个表单就好了,把他们都放在表单里) 单纯的RadioButton是不能只选择一个的,除非你手动给他们加上代码: RadioButton1.Group ...

  3. 1、JPA-HelloWorld

    /** * JPA 是 hibernate 的一个抽象(就像JDBC和JDBC驱动的关系) * JPA 本质上是一种 ORM 规范,不是 ORM 框架,因为 JPA 并未提供 ORM 实现,只是制订了 ...

  4. .NET技术-1.0.使用反射、特性简化代码(验证Model类)

    使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...

  5. 利用css3给座右铭设置漂亮的渐变色

    .footer-container .footer-content p .motto { font-weight: bolder; -webkit-background-clip: text; -we ...

  6. hbase记录-备份脚本参考

    #!/bin/sh ################################## # CreateDate:// : # ModifyDate:// : ################### ...

  7. Spark源码剖析 - SparkContext的初始化(六)_创建和启动DAGScheduler

    6.创建和启动DAGScheduler DAGScheduler主要用于在任务正式交给TaskSchedulerImpl提交之前做一些准备工作,包括:创建Job,将DAG中的RDD划分到不同的Stag ...

  8. Http状态码解释

    参考:urllib与urllib2的学习总结(python2.7.X) # Table mapping response codes to messages; entries have the # f ...

  9. Kettle系列:Pentaho DI (Kettle) 下载地址

    Kettle 8 已经发布, 下载地址还不太好找, 这里记录一下: 注: 所有大型软件升级都需要谨慎,  尤其是大版本的第一个小版本都不推荐在生产环境使用. github 总是有最新版 https:/ ...

  10. 【八】虚拟机工具 01 jps命令详解

    JPS 名称: jps - Java Virtual Machine Process Status Tool 命令用法: jps [options] [hostid] options:命令选项,用来对 ...