8
在ExtJs中,有許多選項可用於過濾網格。文檔中有兩個很好的示例,如this question中所引用的示例。ExtJs - 在列標題中篩選具有搜索字段的網格
然而,其隱藏在Ext.ux.grid.FiltersFeature
默認下拉菜單中的過濾器找我好不尷尬。一個好的符合人體工程學的選擇會在列標題中創建搜索字段,例如his question中的@Ctacus顯示。
這是如何實現的?
在ExtJs中,有許多選項可用於過濾網格。文檔中有兩個很好的示例,如this question中所引用的示例。ExtJs - 在列標題中篩選具有搜索字段的網格
然而,其隱藏在Ext.ux.grid.FiltersFeature
默認下拉菜單中的過濾器找我好不尷尬。一個好的符合人體工程學的選擇會在列標題中創建搜索字段,例如his question中的@Ctacus顯示。
這是如何實現的?
經過對稀疏文檔的大量研究,並感謝SO中的重要問題和解答,我想出了一個簡單的類,它增加了此功能並允許進行配置。
它看起來像這樣:
您在您的網格中添加這一領域是這樣的:
Ext.define('Sandbox.view.OwnersGrid', {
extend: 'Ext.grid.Panel',
requires: ['Sandbox.view.SearchTrigger'],
alias: 'widget.ownersGrid',
store: 'Owners',
columns: [{
dataIndex: 'id',
width: 50,
text: 'ID'
}, {
dataIndex: 'name',
text: 'Name',
items:[{
xtype: 'searchtrigger',
autoSearch: true
}]
},
以下configs
是可能的,就像在文檔的Ext.util.Filter
描述工作:
anyMatch
caseSensitive
exactMatch
operator
autoSearch
。如果爲true,則過濾器會在您鍵入時進行搜索,如果爲false或未設置,則必須單擊搜索圖標才能應用過濾器。ExtJs的5/6來源:
Ext.define('Sandbox.view.SearchTrigger', {
extend: 'Ext.form.field.Text',
alias: 'widget.searchtrigger',
triggers:{
search: {
cls: 'x-form-search-trigger',
handler: function() {
this.setFilter(this.up().dataIndex, this.getValue())
}
},
clear: {
cls: 'x-form-clear-trigger',
handler: function() {
this.setValue('')
if(!this.autoSearch) this.setFilter(this.up().dataIndex, '')
}
}
},
setFilter: function(filterId, value){
var store = this.up('grid').getStore();
if(value){
store.removeFilter(filterId, false)
var filter = {id: filterId, property: filterId, value: value};
if(this.anyMatch) filter.anyMatch = this.anyMatch
if(this.caseSensitive) filter.caseSensitive = this.caseSensitive
if(this.exactMatch) filter.exactMatch = this.exactMatch
if(this.operator) filter.operator = this.operator
console.log(this.anyMatch, filter)
store.addFilter(filter)
} else {
store.filters.removeAtKey(filterId)
store.reload()
}
},
listeners: {
render: function(){
var me = this;
me.ownerCt.on('resize', function(){
me.setWidth(this.getEl().getWidth())
})
},
change: function() {
if(this.autoSearch) this.setFilter(this.up().dataIndex, this.getValue())
}
}
})
對於ExtJs的6.2.0,在following bug and its workaround是有關這一點,否則該列不能flex
編輯。
ExtJS的4來源:
Ext.define('Sandbox.view.SearchTrigger', {
extend: 'Ext.form.field.Trigger',
alias: 'widget.searchtrigger',
triggerCls: 'x-form-clear-trigger',
trigger2Cls: 'x-form-search-trigger',
onTriggerClick: function() {
this.setValue('')
this.setFilter(this.up().dataIndex, '')
},
onTrigger2Click: function() {
this.setFilter(this.up().dataIndex, this.getValue())
},
setFilter: function(filterId, value){
var store = this.up('grid').getStore();
if(value){
store.removeFilter(filterId, false)
var filter = {id: filterId, property: filterId, value: value};
if(this.anyMatch) filter.anyMatch = this.anyMatch
if(this.caseSensitive) filter.caseSensitive = this.caseSensitive
if(this.exactMatch) filter.exactMatch = this.exactMatch
if(this.operator) filter.operator = this.operator
console.log(this.anyMatch, filter)
store.addFilter(filter)
} else {
store.filters.removeAtKey(filterId)
store.reload()
}
},
listeners: {
render: function(){
var me = this;
me.ownerCt.on('resize', function(){
me.setWidth(this.getEl().getWidth())
})
},
change: function() {
if(this.autoSearch) this.setFilter(this.up().dataIndex, this.getValue())
}
}
})
我能夠實現我的ExtJS的電網代碼。其中一個問題是,有時用戶無法使用鼠標單擊在列中的searchTrigger字段之間切換。此外,「Tab」鍵用於在searchTriggers之間切換。你遇到同樣的問題嗎? – vinay
我發現有些情況下,我無法用鼠標點擊訪問serach字段,但我沒有看得更遠,並且在出現問題時我沒有認識到任何模式。 –
好的。謝謝。我正在修復它。有時在鼠標點擊時,「焦點」事件根本不被觸發,搜索字段不可訪問。它是隨機的,有時它有效,有時它不起作用。我會繼續排除故障,讓我知道你是否找到了一些東西。 – vinay