ExtJS - 清除商店过滤器后,类型查询不起作用
ExtJS - After clearing filter(s) of store, type query does not work
我正在为多个用户界面使用 combobox
的实例。因此,当用户关注它时,我需要重置组合框商店。 Combo 的商店本地排序;所以我执行 Ext.data.Store
class 的 clearFilter()
函数 - 它按预期工作,除了 键入查询 不再工作。
这是我的组合框配置:
forceSelection: true,
autoSelect: false,
typeAhead: false,
triggerAction: 'all'
店铺配置:
autoLoad: false,
autoSync: false,
remoteSort: false,
proxy: {
type: 'ajax'
// other configs
}
编辑: fiddle
注意: combobox
的 Store
在 fiddle 中使用 静态数据 当原来的使用 AJAX proxy
正如我从您的 fiddle 了解到的,您在对不同的组合框实施过滤器时遇到了麻烦。我认为您目前对组合框使用同一商店的问题。这就是为什么您还应该更改每个组合框的商店。将此代码添加到您的 fiddle.
combo1.getStore().filter('nationality', 'USA');
container.on('tabchange', function(tabpanel, newCard, oldCard, eOpts) {
combo2.getStore().clearFilter();
combo1.getStore().filter('nationality', 'USA');
if (combo2.getValue()) {
combo1.getStore().clearFilter();
combo1.getStore().filter('userId', combo2.getValue())
}
});
顺便说一句,由于静态存储,我将过滤器放在 tabchange 事件之前。但是,如果您使用代理(AJAX)存储,您可能想要添加过滤器存储侦听器。像这样:
listeners: {
load: function(store, records) {
store.filter('nationality', 'USA');
}
}
编辑:
var store = combo1.getStore();
store.filter('nationality', 'USA');
container.on('tabchange', function(tabpanel, newCard, oldCard, eOpts) {
if (newCard.title == 'Panel 1') {
store.clearFilter();
store.filter('nationality', 'USA');
} else if (newCard.title == 'Panel 2') {
store.clearFilter();
// Or whatever filter because you have to change the store
// dynamically if you wanna use same store for different combos
}
});
希望这对您有所帮助。祝你好运。
我想我通过查看 post 解决了您的问题:
ExtJs: Search / Filter within a ComboBox
在组合框的每次击键上添加自定义过滤器似乎可以解决您的问题:
enableKeyEvents:true,
listeners: {
'keyup': function() {
this.getStore().clearFilter();
this.getStore().filter('name', this.getRawValue(), true, false);
},
'beforequery': function(queryEvent) {
queryEvent.combo.onLoad();
}
}
它不漂亮,但我认为它有效。看看这个扩展 fiddle:
我正在为多个用户界面使用 combobox
的实例。因此,当用户关注它时,我需要重置组合框商店。 Combo 的商店本地排序;所以我执行 Ext.data.Store
class 的 clearFilter()
函数 - 它按预期工作,除了 键入查询 不再工作。
这是我的组合框配置:
forceSelection: true,
autoSelect: false,
typeAhead: false,
triggerAction: 'all'
店铺配置:
autoLoad: false,
autoSync: false,
remoteSort: false,
proxy: {
type: 'ajax'
// other configs
}
编辑: fiddle
注意: combobox
的 Store
在 fiddle 中使用 静态数据 当原来的使用 AJAX proxy
正如我从您的 fiddle 了解到的,您在对不同的组合框实施过滤器时遇到了麻烦。我认为您目前对组合框使用同一商店的问题。这就是为什么您还应该更改每个组合框的商店。将此代码添加到您的 fiddle.
combo1.getStore().filter('nationality', 'USA');
container.on('tabchange', function(tabpanel, newCard, oldCard, eOpts) {
combo2.getStore().clearFilter();
combo1.getStore().filter('nationality', 'USA');
if (combo2.getValue()) {
combo1.getStore().clearFilter();
combo1.getStore().filter('userId', combo2.getValue())
}
});
顺便说一句,由于静态存储,我将过滤器放在 tabchange 事件之前。但是,如果您使用代理(AJAX)存储,您可能想要添加过滤器存储侦听器。像这样:
listeners: {
load: function(store, records) {
store.filter('nationality', 'USA');
}
}
编辑:
var store = combo1.getStore();
store.filter('nationality', 'USA');
container.on('tabchange', function(tabpanel, newCard, oldCard, eOpts) {
if (newCard.title == 'Panel 1') {
store.clearFilter();
store.filter('nationality', 'USA');
} else if (newCard.title == 'Panel 2') {
store.clearFilter();
// Or whatever filter because you have to change the store
// dynamically if you wanna use same store for different combos
}
});
希望这对您有所帮助。祝你好运。
我想我通过查看 post 解决了您的问题: ExtJs: Search / Filter within a ComboBox
在组合框的每次击键上添加自定义过滤器似乎可以解决您的问题:
enableKeyEvents:true,
listeners: {
'keyup': function() {
this.getStore().clearFilter();
this.getStore().filter('name', this.getRawValue(), true, false);
},
'beforequery': function(queryEvent) {
queryEvent.combo.onLoad();
}
}
它不漂亮,但我认为它有效。看看这个扩展 fiddle: