ExtJs5.1多选下拉框CheckComb
ExtJs这么多个版本号了。可就是不提供多选下拉框,老外不用这个玩意吗?
5都出来这么久了,新写的项目就用5吧,把曾经Extjs4.2的时搜到前人的CheckComb改巴改巴。能用了就赶紧贴上来,没有细致測试各种情况。
Ext.define('Ext.ux.CheckCombo', {
extend : 'Ext.form.field.ComboBox',
alias : 'widget.checkcombo',
multiSelect : true,
allSelector : false,
noData : true,
noDataText : 'No combo data',
addAllSelector : false,
allSelectorHidden : false,
enableKeyEvents : true,
afterExpandCheck : false,
allText : 'All',
oldValue : '',
listeners : {
/*
* uncomment if you want to reload store on every combo expand
* beforequery: function(qe) { this.store.removeAll(); delete
* qe.combo.lastQuery; },
*/
focus : function(cpt) {
cpt.oldValue = cpt.getValue();
}
},
createPicker : function() {
var me = this, picker, menuCls = Ext.baseCSSPrefix + 'menu', opts = Ext
.apply({
pickerField : me,
selectionModel : me.pickerSelectionModel,
floating : true,
hidden : true,
ownerCt : me.ownerCt,
cls : me.el.up('.' + menuCls) ? menuCls : '',
store : me.getPickerStore(),
displayField : me.displayField,
preserveScrollOnRefresh : true,
pageSize : me.pageSize,
tpl : [
'<tpl for=".">',
'<div class="x-boundlist-item" role="option"><span class="x-combo-checker"> </span> {'
+ me.displayField + '}</div>', '</tpl>']
}, me.listConfig, me.defaultListConfig);
picker = me.picker = Ext.create('Ext.view.BoundList', opts);
if (me.pageSize) {
picker.pagingToolbar.on('beforechange', me.onPageChange, me);
}
// We limit the height of the picker to fit in the space above
// or below this field unless the picker has its own ideas about that.
if (!picker.initialConfig.maxHeight) {
picker.on({
beforeshow : me.onBeforePickerShow,
scope : me
});
}
picker.getSelectionModel().on({
beforeselect : me.onBeforeSelect,
beforedeselect : me.onBeforeDeselect,
scope : me
});
picker.getNavigationModel().navigateOnSpace = false;
me.store.on('load', function(store) {
if (store.getTotalCount() == 0) {
me.allSelectorHidden = true;
if (me.allSelector != false)
me.allSelector.setStyle('display', 'none');
if (me.noData != false)
me.noData.setStyle('display', 'block');
} else {
me.allSelectorHidden = false;
if (me.allSelector != false)
me.allSelector.setStyle('display', 'block');
if (me.noData != false)
me.noData.setStyle('display', 'none');
}
});
return picker;
},
reset : function() {
var me = this;
me.setValue('');
},
setValue : function(value) {
this.value = value;
if (!value) {
if (this.allSelector != false)
this.allSelector.removeCls('x-boundlist-selected');
return this.callParent(arguments);
}
if (typeof value == 'string') {
var me = this, records = [], vals = value.split(',');
if (value == '') {
if (me.allSelector != false)
me.allSelector.removeCls('x-boundlist-selected');
} else {
if (vals.length == me.store.getCount() && vals.length != 0) {
if (me.allSelector != false)
me.allSelector.addCls('x-boundlist-selected');
else
me.afterExpandCheck = true;
}
}
Ext.each(vals, function(val) {
var record = me.store.getById(parseInt(val));
if (record)
records.push(record);
});
return me.setValue(records);
} else
return this.callParent(arguments);
},
getValue : function() {
if (typeof this.value == 'object')
return this.value.join(',');
else
return this.value;
},
getSubmitValue : function() {
return this.getValue();
},
expand : function() {
var me = this, bodyEl, picker, doc, collapseIf;
if (me.rendered && !me.isExpanded && !me.isDestroyed) {
bodyEl = me.bodyEl;
picker = me.getPicker();
doc = Ext.getDoc();
collapseIf = me.collapseIf;
picker.setMaxHeight(picker.initialConfig.maxHeight);
if (me.matchFieldWidth) {
picker.width = me.bodyEl.getWidth();
}
// Show the picker and set isExpanded flag. alignPicker only works
// if isExpanded.
picker.show();
me.isExpanded = true;
me.alignPicker();
bodyEl.addCls(me.openCls);
if (me.noData == false)
me.noData = picker.getEl().down('.x-boundlist-list-ct')
.insertHtml(
'beforeBegin',
'<div class="x-boundlist-item" role="option">'
+ me.noDataText + '</div>', true);
if (me.addAllSelector == true && me.allSelector == false) {
me.allSelector = picker
.getEl()
.down('.x-boundlist-list-ct')
.insertHtml(
'beforeBegin',
'<div class="x-boundlist-item" role="option"><span class="x-combo-checker"> </span> '
+ me.allText + '</div>', true);
me.allSelector.on('click', function(e) {
if (me.allSelector.hasCls('x-boundlist-selected')) {
me.allSelector
.removeCls('x-boundlist-selected');
me.setValue('');
me.fireEvent('select', me, []);
} else {
var records = [];
me.store.each(function(record) {
records.push(record);
});
me.allSelector.addCls('x-boundlist-selected');
me.select(records);
me.fireEvent('select', me, records);
}
});
if (me.allSelectorHidden == true)
me.allSelector.hide();
else
me.allSelector.show();
if (me.afterExpandCheck == true) {
me.allSelector.addCls('x-boundlist-selected');
me.afterExpandCheck = false;
}
}
// Collapse on touch outside this component tree.
// Because touch platforms do not focus document.body on touch
// so no focusleave would occur to trigger a collapse.
me.touchListeners = doc.on({
// Do not translate on non-touch platforms.
// mousedown will blur the field.
translate : false,
touchstart : me.collapseIf,
scope : me,
delegated : false,
destroyable : true
});
// Scrolling of anything which causes this field to move should
// collapse
me.scrollListeners = Ext.on({
scroll : me.onGlobalScroll,
scope : me,
destroyable : true
});
// monitor touch and mousewheel
me.hideListeners = doc.on({
mousewheel : me.collapseIf,
touchstart : me.collapseIf,
scope : me,
delegated : false,
destroyable : true
});
// Buffer is used to allow any layouts to complete before we align
Ext.on('resize', me.alignPicker, me, {
buffer : 1
});
me.fireEvent('expand', me);
me.onExpand();
} else {
me.fireEvent('expand', me);
me.onExpand();
}
},
onListSelectionChange : function(list, selectedRecords) {
var me = this, isMulti = me.multiSelect, hasRecords = selectedRecords.length > 0;
// Only react to selection if it is not called from setValue, and if our
// list is
// expanded (ignores changes to the selection model triggered elsewhere)
if (!me.ignoreSelection && me.isExpanded) {
if (!isMulti) {
Ext.defer(me.collapse, 1, me);
}
/*
* Only set the value here if we're in multi selection mode or we
* have a selection. Otherwise setValue will be called with an empty
* value which will cause the change event to fire twice.
*/
if (isMulti || hasRecords) {
me.setValue(selectedRecords, false);
}
if (hasRecords) {
me.fireEvent('select', me, selectedRecords);
}
me.inputEl.focus();
if (me.addAllSelector == true && me.allSelector != false) {
if (selectedRecords.length == me.store.getTotalCount())
me.allSelector.addCls('x-boundlist-selected');
else
me.allSelector.removeCls('x-boundlist-selected');
}
}
}
});
还有相关的css啊,图片就自己找吧。我是把4里面的图片copy过来的:
/*ext多选下拉框样式,未选*/
.x-combo-checker {
background-position: 50% -2px;
margin-left: 1px;
background-color: transparent;
background-image:url(../thirdjs/extjs513/ext-theme-classic/images/unchecked.gif);
background-position: -1px -1px;
background-repeat: no-repeat;
height: 14px;
width: 14px;
display: inline-block;
} /*ext多选下拉框样式,已选*/
.x-boundlist-selected .x-combo-checker {
background-image:url(../thirdjs/extjs513/ext-theme-classic/images/checked.gif);
}
ExtJs5.1多选下拉框CheckComb的更多相关文章
- Easyui-Combobox多选下拉框
因为工作需要,引入combobox多选下拉框,并且获取选择的值并以","分开. 效果如下: 代码如下: <html> <head> <title> ...
- Extjs4.2 多选下拉框
//多选下拉框 Ext.define('MDM.view.custom.MultiComboBox', { extend: 'Ext.form.ComboBox', alias: 'widget.mu ...
- js:jquery multiSelect 多选下拉框实例
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- DropDownList单选与多选下拉框
一.单选DropDownList传值 1.添加界面的DropDownList显示值问题 (1)在方法内添加ViewData的方法: var ad = new UnitsRepository(); Vi ...
- pentaho cde 自定义复选下拉框 checkbox select
pentaho 自带的component 虽多,但是当用户需要在一个表格中查看多个组别的数据时,pentaho自带的单选框就不能实现了,所以复选下拉框势在必行,实现效果如下: 实现原理是借用了jqu ...
- Bootstrap3级联多选下拉框
<!DOCTYPE html> <html> <head> <title>Bootstrap3级联多选下拉框</title> <met ...
- js怎么能取得多选下拉框选中的多个值?
方法:获取多选下拉框对象数组→循环判断option选项的selected属性(true为选中,false为未选中)→使用value属性取出选中项的值.实例演示如下: 1.HTML结构 1 2 3 4 ...
- js多选下拉框
1.js原生实现 1.1:引用JS文件 /*! jQuery v1.12.4 | (c) jQuery Foundation | jquery.org/license */ !function(a,b ...
- query多选下拉框插件 jquery-multiselect(修改)
其实网上关于该控件的使用教程已经很多了,其中 query多选下拉框插件 jquery-multiselect Jquery多选下拉列表插件jquery multiselect功能介绍及使用 这2个的介 ...
随机推荐
- js 和 jquery的宽高
window 和 document : window 对象表示浏览器打开的窗口,可以省略 document对象(浏览器的html文档)是window对象的一部分 document.body等于wind ...
- (二) Spring项目的搭建
传统的项目搭建,是将所依赖的第三方jar包复制到项目的类路径下.但是,这样带来的问题是,无法更好的对这些jar包进行动态管理. 目前主流的构建工具有:Ant.Maven.Gradle.以Maven为例 ...
- Bzoj1195 [HNOI2006]最短母串 [状态压缩]
Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 1304 Solved: 439 Description 给定n个字符串(S1,S2,„,Sn),要求找 ...
- Bzoj3652 大新闻
Time Limit: 10 Sec Memory Limit: 512 MBSec Special JudgeSubmit: 215 Solved: 112 Description Input ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---55
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- AC日记——仙岛求药 openjude 2727
仙岛求药 思路: bfs: 来,上代码: #include <cstdio> #include <cstring> #include <iostream> #inc ...
- java8 之CompletableFuture -- 如何构建异步应用
什么是Future 接口 很多场景下,我们想去获取线程运行的结果,而通常使用execute方法去提交任务是无法获得结果的,这时候我们常常会改用submit方法去提交,以便获得线程运行的结果. 而sub ...
- 洛谷——P2626 斐波那契数列(升级版)
P2626 斐波那契数列(升级版) 题目背景 大家都知道,斐波那契数列是满足如下性质的一个数列: • f(1) = 1 • f(2) = 1 • f(n) = f(n-1) + f(n-2) (n ≥ ...
- Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一)
Xamarin XAML语言教程Xamarin.Forms中程序状态与进度(一) 在Xamarin.Forms中,提供了两个控件用来指示程序的状态和进度.他们分别为活动指示器和进度条.其中,活动指示器 ...
- AbstractAdvisingBeanPostProcessor---spring aop 处理器
开局一张图,我们先上张图 类的说明和继承关系/** * Base class for {@link BeanPostProcessor} implementations that apply a * ...