我有一个ExtJS 4.1组合框与JsonStore和queryMode: 'remote',分页和过滤,如:
<>之前…queryMode:"远程",allowBlank:没错,forceSelection:没错,自动选择:假的,页大小:25日typeAhead:没错,minChars: 2…之前当我在这个组合框中加载带有保存值的表单时,我加载存储,将保存的值作为查询(过滤)参数传递,以确保所选值肯定在返回的记录中,然后我将该值设置为组合选择值,如下所示:
<>之前mycombo.getStore () .load ({参数:{查询:displayField},范围:{领域:组合,valueField: valueField,displayField: displayField},回调:函数(记录,操作,成功){this.field.setValue (this.valueField);}});之前到目前为止,一切顺利,上面的工作正常。问题是,如果用户随后单击下拉箭头为组合选择另一个值,则会加载存储的第一页,擦除之前选择的所有值,即使没有选择任何值,也会丢失之前选择的值。
这个问题是通用的,和下面这个问题很相似:ExtJS页面组合与远程JSON存储。用分页显示所选值可以总结为:
在具有远程存储和分页功能的ExtJS组合框中,当加载的页面发生变化时,所选值将丢失。
我尝试为存储设置clearOnPageLoad: false
,但是每次加载新页面时,记录都被附加到列表的末尾。我希望这个参数缓存加载的页面,并且在前后移动时仍然显示正确的页面。
那么,关于如何在页面之间移动时保持选定值有什么想法吗?我想我可以用选择的值手动创建一个记录,并在每次页面加载时将其附加到存储中,直到选择新值为止,但是对于如此基本的东西来说,这听起来太费力了。
我们最终联系了Sencha支持,因为我们有付费许可。这是我们得到的答案:
Ext.override(Ext.form.field.ComboBox, {
onLoad: function() {
var me = this,
value = me.value;
if (me.ignoreSelection > 0) {
--me.ignoreSelection;
}
if (me.rawQuery) {
me.rawQuery = false;
me.syncSelection();
if (me.picker && !me.picker.getSelectionModel().hasSelection()) {
me.doAutoSelect();
}
}
else {
if (me.value || me.value === 0) {
if (me.pageSize === 0) { // added for paging; do not execute on page change
me.setValue(me.value);
}
} else {
if (me.store.getCount()) {
me.doAutoSelect();
} else {
me.setValue(me.value);
}
}
}
}
});
有同样的问题,' prunermoved: false'不起作用(它似乎只在网格中使用)。解决方案如下:
Ext.override(Ext.form.field.ComboBox,{
// lastSelection is searched for records
// (together with store's records which are searched in the parent call)
findRecord: function(field, value) {
var foundRec = null;
Ext.each(this.lastSelection, function(rec) {
if (rec.get(field) === value) {
foundRec = rec;
return false; // stop 'each' loop
}
});
if (foundRec) {
return foundRec;
} else {
return this.callParent(arguments);
}
}
});
希望它没有负面的副作用。我已经测试了一下,看起来还可以。
我在extjs 6.0.1中遇到这个问题。
我发现了一个可能对其他人有帮助的工作。
在调用基本onLoad之前,我使用重写onLoad将组合中的选定记录添加到存储中。
这是有效的,因为如果选中的记录在正在查看的页面中,则组合足够聪明,不会清除所选内容。换句话说,在您的页面中清除选择的原因是因为所选记录不在您正在查看的页面中。
onLoad: function (store, records, success)
{
var selection = this.getSelection();
if (selection)
{
records.unshift(selection);
store.insert(0, records);
}
this.callParent(arguments);
}