当我通过向底层商店添加过滤器来过滤组合框时,有时过滤器有效(项目被删除),有时它没有效果。我调试了filterBy函数;它被调用并返回true / false,因为我希望过滤/显示项目。
我在ExtJS论坛上看到,“Combobox使用过滤(即使使用triggerAction:'all'),所以你自己的触发器会被组合框中的触发器取代。”两个过滤器?
在Ext JS组合框中删除临时项目的正确方法是什么?
答案 0 :(得分:5)
使用lastQuery:''在配置中。
我遇到了类似的问题,无论过滤器是什么,组合框都会在第一次点击触发器时显示所有项目。
要确保在第一次使用ComboBox触发器时未清除商店中的过滤器,请使用lastQuery =''配置组合。 http://docs.sencha.com/extjs/4.2.1/#!/api/Ext.form.field.ComboBox-property-lastQuery
答案 1 :(得分:3)
你想了解如何重现triggerAction的行为:'all',那么为什么不深入研究代码?
这里是Class ComboBox的源代码: http://docs.sencha.com/ext-js/4-0/source/ComboBox.html#Ext-form-field-ComboBox-cfg-triggerAction
如果查看代码,您会看到:
1)单击触发器时,将调用方法doQuery。
onTriggerClick: function() {
var me = this;
if (!me.readOnly && !me.disabled) {
if (me.isExpanded) {
me.collapse();
} else {
me.onFocus({});
if (me.triggerAction === 'all') {
me.doQuery(me.allQuery, true);
} else {
me.doQuery(me.getRawValue(), false, true);
}
}
me.inputEl.focus();
}
},
2)在方法doQuery中,有趣的代码是:
if (isLocalMode) {
// forceAll means no filtering - show whole dataset.
if (forceAll) {
store.clearFilter();
} else {
// Clear filter, but supress event so that the BoundList is not immediately updated.
store.clearFilter(true);
store.filter(me.displayField, queryString);
}
}
3)我们可以看到Store的方法过滤器被调用。 你有答案,正确的技术是删除ExtJS组合框中的临时项目(通常在商店中),正在使用商店中的方法过滤器。
http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.Store-method-filter
记住,你最好的朋友总是记录在案! http://docs.sencha.com/ext-js/4-0/#
答案 2 :(得分:1)
你需要删除Combobox的属性'lastQuery', 每次过滤商店时。这是ComboBox缓存的地方 它是第一次构建它之后的Entryset。
所以做这样的事情:
'window combobox[name=countryselection]' : {
'change' : function(view, newValue){
with(Ext.data.StoreManager.lookup('Subcountries')){
var combobox = Ext.getCmp('MainWindow').query('combobox[name=subcountryselection]')[0];
//force the combobox the rebuild its entryset
delete combobox.lastQuery;
clearFilter();
filter('countryId', newValue);
}
}
}
它对我很有用: - )
答案 3 :(得分:0)
请注意,过滤不会使用新数据“重新创建”商店,例如,如果您使用"apple"
的以下值过滤了组合:
orange
banana
apple
点击触发器,会显示“apple”。但是,如果您开始输入(并且typeAhead: true
处于有效状态,则根据您的输入进行的过滤将默认返回orange/banana/apple
商店。