[英]ExtJs combo loses selected value on store page load
我有一個帶有JsonStore和queryMode的ExtJS 4.1組合框:'remote',具有分頁和過濾功能,如下所示:
... queryMode: 'remote', allowBlank: true, forceSelection: true, autoSelect: false, pageSize: 25, typeAhead: true, minChars: 2, ...
當我在此組合框中加載帶有保存值的表單時,我加載商店將保存的值作為查詢(過濾)參數傳遞,以確保所選值肯定在返回的記錄中,然后我設置該值作為組合選擇的值如下:
mycombo.getStore().load({ params: { query: displayField }, scope: { field: combo, valueField: valueField, displayField: displayField }, callback: function(records, operation, success) { 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);
}
}
}
}
});
有同樣的問題,'pruneRemoved: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的override來將組合中的選定記錄添加到商店。
這是有效的,因為如果所選記錄在正在查看的頁面中,則組合足夠智能,無法清除選擇。 換句話說,在您翻頁時清除選擇的原因是因為所選記錄不在您正在查看的頁面中。
onLoad: function (store, records, success)
{
var selection = this.getSelection();
if (selection)
{
records.unshift(selection);
store.insert(0, records);
}
this.callParent(arguments);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.