国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

自定義ExtJS控件之下拉樹和下拉表格附源碼

2024-05-06 15:53:04
字體:
來源:轉載
供稿:網友
在Ext官方的例子中只有下拉列表控件,但是在實際業務中只有下拉列表無法滿足需求的,對于剛使用Ext的人來說,自定義一個控件好難,下面是具體的實現

簡介

在Ext官方的例子中只有下拉列表控件,但是在實際業務中只有下拉列表無法滿足需求的,像下拉樹和下拉表格都是很常見的控件,對于剛使用Ext的人來說,自定義一個控件好難,其實多讀官方的源碼有些事情就不會那么難了。下面是下拉樹的代碼:

復制代碼 代碼如下:


Ext.define('ComboTreeBox',{
extend : 'Ext.form.field.ComboBox',

multiSelect : true,

createPicker : function(){
var me = this;

//創建樹控件
var picker = Ext.create('Ext.tree.Panel', {
store: me.store,
rootVisible: false,
selModel: {
mode: me.multiSelect ? 'SIMPLE' : 'SINGLE'
},
floating: true,
hidden: true,
focusOnToFront: false
});
//注冊事件用于選擇用戶選擇的值
me.mon(picker, {
itemclick: me.onItemClick,
refresh: me.onListRefresh,
scope: me
});

me.mon(picker.getSelectionModel(), {
beforeselect: me.onBeforeSelect,
beforedeselect: me.onBeforeDeselect,
selectionchange: me.onListSelectionChange,
scope: me
});
this.picker = picker;
return picker;
},

onItemClick: function(picker, record){
/*
* If we're doing single selection, the selection change events won't fire when
* clicking on the selected element. Detect it here.
*/
var me = this,
selection = me.picker.getSelectionModel().getSelection(),
valueField = me.valueField;

if (!me.multiSelect && selection.length) {
if (record.get(valueField) === selection[0].get(valueField)) {
// Make sure we also update the display value if it's only partial
me.displayTplData = [record.data];
me.setRawValue(me.getDisplayValue());
me.collapse();
}
}
}
});


下拉樹的代碼很簡單,只要集成Ext.form.field.ComboBox類,然后重寫createPicker方法就可以了,同理下拉表格也是如此,下面是下拉表格的代碼:

復制代碼 代碼如下:


Ext.define('ComboGridBox',{
extend : 'Ext.form.field.ComboBox',

multiSelect : true,

createPicker : function(){
var me = this;

var picker = Ext.create('Ext.grid.Panel', {
title : '下拉表格',
store: me.store,
frame : true,
resizable : true,
columns : [{
text : '#ID',
dataIndex : 'id'
},{
text : '名稱' ,
dataIndex : 'name'
},{
text : '描述' ,
dataIndex : 'desc'
}],
selModel: {
mode: me.multiSelect ? 'SIMPLE' : 'SINGLE'
},
floating: true,
hidden: true,
width : 300,
columnLines : true,
focusOnToFront: false
});
me.mon(picker, {
itemclick: me.onItemClick,
refresh: me.onListRefresh,
scope: me
});

me.mon(picker.getSelectionModel(), {
beforeselect: me.onBeforeSelect,
beforedeselect: me.onBeforeDeselect,
selectionchange: me.onListSelectionChange,
scope: me
});
this.picker = picker;
return picker;
},

onItemClick: function(picker, record){
/*
* If we're doing single selection, the selection change events won't fire when
* clicking on the selected element. Detect it here.
*/
var me = this,
selection = me.picker.getSelectionModel().getSelection(),
valueField = me.valueField;

if (!me.multiSelect && selection.length) {
if (record.get(valueField) === selection[0].get(valueField)) {
// Make sure we also update the display value if it's only partial
me.displayTplData = [record.data];
me.setRawValue(me.getDisplayValue());
me.collapse();
}
}
},

matchFieldWidth : false,

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();
}
console.log(me.getValue());
},

doAutoSelect: function() {
var me = this,
picker = me.picker,
lastSelected, itemNode;
if (picker && me.autoSelect && me.store.getCount() > 0) {
// Highlight the last selected item and scroll it into view
lastSelected = picker.getSelectionModel().lastSelected;
itemNode = picker.view.getNode(lastSelected || 0);
if (itemNode) {
picker.view.highlightItem(itemNode);
picker.view.el.scrollChildIntoView(itemNode, false);
}
}
}


});


下拉表格也是繼承了Ext.form.field.ComboBox這個類,重寫了createPicker方法。

開發下拉樹和下拉表格看起來so easy,只要研究透了Ext的運行機制,一切都會so easy

控件效果

自定義ExtJS控件之下拉樹和下拉表格附源碼

 

自定義ExtJS控件之下拉樹和下拉表格附源碼



實例下載

實例中的資源為myeclipse項目,導入即可運行,自己添加ext的js和css文件,實例中沒有ext的基礎文件。
下載地址
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 杨浦区| 海丰县| 泾源县| 图片| 高密市| 梁山县| 石楼县| 贵溪市| 峨眉山市| 富平县| 进贤县| 嵊泗县| 炎陵县| 兴业县| 赤峰市| 修文县| 彩票| 牟定县| 湖州市| 隆德县| 定兴县| 阆中市| 黄浦区| 隆子县| 雷山县| 罗平县| 潞西市| 醴陵市| 杨浦区| 福海县| 类乌齐县| 罗甸县| 右玉县| 遵义县| 游戏| 洪泽县| 阿拉善盟| 莆田市| 诸城市| 冀州市| 慈溪市|