ComboBox 綁定 select 事件,切換選項時重新載入 TreeStore。第二次點擊同一選項或切回先前選項,事件不再觸發。
menuTreeStore.proxy = new Ext.data.HttpProxy(...) 替換整個 Proxy,導致 Store 內部事件監聽器 (含 ComboBox 的選中狀態同步) 失效。queryMode: 'remote' 與手動 load() 衝突:遠端模式下 ComboBox 會自動管理載入,手動干預易亂。select。setProxy + load() 並加時間戳 (快速修復)listeners: {
select: function(combo, record, index) {
var projectName = combo.getRawValue();
// 1. 更新 proxy url (不新建 proxy 實例)
menuTreeStore.getProxy().setUrl(
appBaseUri + '/sys/authority/getAuthority?globalRoleId=' + globalRoleId +
'&projectName=' + encodeURIComponent(projectName) +
'&_dc=' + Date.now() // 關鍵:防快取
);
// 2. 重新載入
menuTreeStore.load({
callback: function(records, operation, success) {
if (!success) Ext.Msg.alert('錯誤', '權限樹載入失敗');
}
});
}
}
ExtraParams + load// 定義 Store 時使用 extraParams
var menuTreeStore = Ext.create('Ext.data.TreeStore', {
autoLoad: false,
proxy: {
type: 'ajax',
url: appBaseUri + '/sys/authority/getAuthority',
extraParams: {
globalRoleId: globalRoleId,
projectName: '' // 初始空
},
reader: { type: 'json', root: 'children' }
}
});
// ComboBox 選中時只更新 extraParams 並 load
listeners: {
select: function(combo, record) {
menuTreeStore.getProxy().setExtraParam('projectName', combo.getRawValue());
menuTreeStore.getProxy().setExtraParam('_dc', Date.now()); // 防快取
menuTreeStore.load();
}
}
var projects = Ext.create('Ext.data.JsonStore', {
proxy: { type: 'ajax', url: appBaseUri + '/sys/project/getAll', reader: { type: 'json', root: 'list' } },
fields: ['projectName', 'ItemValue'],
autoLoad: true
});
// ComboBox 綁定 projects,select 事件只負責觸發 TreeStore 重載
var combo = Ext.create('Ext.form.ComboBox', {
store: projects,
queryMode: 'local', // 本地資料,不發遠端查詢
displayField: 'projectName',
valueField: 'ItemValue',
listeners: {
select: function(cb, rec) {
menuTreeStore.getProxy().setExtraParams({
globalRoleId: globalRoleId,
projectName: rec.get('projectName'),
_dc: Date.now()
});
menuTreeStore.load();
}
}
});
getProxy().setUrl() 或 setExtraParam()。_dc=Date.now()) 於 GET/POST URL。queryMode 設正確:本地資料用 local,遠端搜尋用 remote。select 而非 change:select 只在用戶主動選擇觸發,change 含程式設值干擾。// 在 select 事件首行加入
console.log('[%s] select fired, value=%s', new Date().toISOString(), combo.getRawValue());
// 觀察 Console 是否每次點擊都輸出,若無則事件確實未觸發