首页 > 代码库 > [Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项

[Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项

前言

[Ext JS 4] 实战之多选下拉单 (带checkbox)

这一篇中有介绍如何开发带有checkbox 的多选菜单。

但是实际项目开发过程中, 用户的需求也是不断精进的。

使用淘宝或是其他网站购物车功能的用户对全选就特别习惯, 所以他们也希望在下拉单中也能有  "ALL" 这样的选项。

但是Extjs 本身提供的多选下拉单,功能比较有限。

之前有扩充过带 checkbox, 现在又要多扩充一个 "ALL" 选项了。

要求是:

1. 选中"ALL", 其他选项要自动勾选

2. 反选"ALL", 其他选项要自动反选

3. 所有非"ALL"选项都选了, 要自动把 "ALL"勾选

3. 有一个非"ALL"选项选项反选了, 要自动反选 "ALL"


思考思路

要扩充,首先得要有一个思路。

思路1 : 在store 中加入一个ALL 的数据,

很简单的一个store

	var store1 = Ext.create(‘Ext.data.Store‘, {
	    fields: [‘abbr‘, ‘name‘],
	    data : [
	        {"abbr":"ALL", "name":"All"},    
	        {"abbr":"AL", "name":"Alabama"},
	        {"abbr":"AK", "name":"Alaska"},
	        {"abbr":"AZ", "name":"Arizona"}
	    ]

这样的确有一个 ALL 选项, 但是这个ALL 选项和其他选项的作用是一样的。

但是 "ALL" 本身的意义有不一样, 无法达到上面提到的要求。


思路2: 能否在下拉单中增加一个选项, 但是这个选项又和一般的选项不一样, 也就是说它不属于Extjs 的combobox 的选项, 只是添加一个 html 的input 元素, 设置他的onclik 事件, 并与其他的选项进行联动。

Extjs combox 的结构基本上是

1. 显示的input 框和 trigger 的按钮

2. BoundList , 类似于grid 的view , 用来显示下拉单。(可以想象成下拉单是只有一个栏位的 grid)

BoundList 的配置可以在combobox 的listConfig 配置选项中进行配置, 这样的话, 就可以配置显示的template 了

配置类似:

 tpl:	‘<div class="mt-boundlist-item" onclick="clickAllOptionDiv(\‘‘+thisid+‘\‘)"><input onclick="clickAllOptionInput(this)" type="checkbox" id="‘+allOptId+‘">ALL</div>
<tpl for="."><div class="x-boundlist-item"><input type=checkbox>{‘+this.displayField+‘}</div></tpl>‘,

这里配置了整个BoundList的显示格式:

1. 有一个 ALL 选项, 并有相应的 onclick 时间

2. 配置了每个选项的显示效果(带有一个checkbox)

显示部分解决之后, 接下来就是, 联动的处理,

在BoundList 的 onItemSelect 和 onItemDeselect 去处理 ALL 的选项是否要选取。

需要注意的是,

1.因为这里有给ALL  选项的id 为 combobox 的id 加上一些字符, 所以在创建combobox 的时候, 需要指定id

.2. ALL选项的div class 设置成 mt-boundlist-item 目的是为了和其他选项的显示效果一致。

这个Class 的定义如下:

<style>
.mt-boundlist-item {
  padding: 0 6px;
  line-height: 22px;
  cursor: pointer;
  cursor: hand;
  position: relative;
  /*allow hover in IE on empty items*/
  zoom: 1;
  border-width: 1px;
  border-style: dotted;
  border-color: white;
}
</style>
<script>

这个内容和Extjs 本身的 x-boundlist-Item是一样的, 只是ALL选项的Class 不能用那个Class(因为用了, 就会被当成一般的选项)

代码

/*********************************
 * @author: Oscar999
 * @Description: New Widgets Extend from Ext
 * @verion: V1.0
 **********************************/

/**
 * begin for multi Select combobox
 */
Ext.define(‘Ext.ux.MultiComboBox‘, {
    extend: ‘Ext.form.ComboBox‘,
    alias: ‘widget.multicombobox‘,
    xtype: ‘multicombobox‘,
    validate:function() {
	    var errs =[]; 
	    var val = this.getRawValue();
	    if (this.store.data && this.store.data.items.length>0){
	        if (this.xtype=="multicombobox"){
	        	var ssRawValues=[];
	        	if (val){
		        	if ((this.id==="projectList")||val.indexOf(", ")>0){
		        		ssRawValues=val.split(", ");
		        	}
		        	else{
		        		ssRawValues=val.split(",");
		        	}
	        	}
	        	for(var ii=0;ii<ssRawValues.length;ii++){
	        		var selectedValue=http://www.mamicode.com/ssRawValues[ii];>
贴一下全部的代码。

调用的方式如下:

	var store1 = Ext.create(‘Ext.data.Store‘, {
	    fields: [‘abbr‘, ‘name‘],
	    data : [
	        //{"abbr":"ALL", "name":"All"},    
	        {"abbr":"AL", "name":"Alabama"},
	        {"abbr":"AK", "name":"Alaska"},
	        {"abbr":"AZ", "name":"Arizona"}
	        //...
	    ]
	});
	
	Ext.create(‘Ext.ux.MultiComboBox‘,{
		fieldLabel:‘Multi Combox 1‘,
		id:‘nulticombox1‘, //must
		renderTo:‘combox‘,
		//queryMode:‘local‘,
		width:600,
		displayField:‘name‘,
		valueField:‘abbr‘,
		value:[‘AL‘],
		store:store1
	});

实现的效果如下:



继续

其实,问题到以上基本上以及介绍了。

但是正如上面看到的。

有的用户认为, 全选的话, 应该显示成ALL,而不是其他的所有选项。

这样的需求也算合理, 改进一般, 直接上源码

/*********************************
 * @author: Oscar999
 * @Description: New Widgets Extend from Ext
 * @verion: V1.0
 **********************************/

/**
 * begin for multi Select combobox
 */
Ext.define(‘Ext.ux.MultiComboBox‘, {
    extend: ‘Ext.form.ComboBox‘,
    alias: ‘widget.multicombobox‘,
    xtype: ‘multicombobox‘,
    validate:function() {
	    var errs =[]; 
	    var val = this.getRawValue();
	    if (this.store.data && this.store.data.items.length>0){
	        if (this.xtype=="multicombobox"){
	        	var ssRawValues=[];
	        	if (val){
		        	if ((this.id==="projectList")||val.indexOf(", ")>0){
		        		ssRawValues=val.split(", ");
		        	}
		        	else{
		        		ssRawValues=val.split(",");
		        	}
	        	}
	        	for(var ii=0;ii<ssRawValues.length;ii++){
	        		var selectedValue=http://www.mamicode.com/ssRawValues[ii];>
实现效果





[Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项