前言
最近在寫ExtJS窗體組件的時候鹅颊,遇到了一個由于ID重復(fù)引起的異常問題敷存。折騰了挺久的,終于解決了堪伍,這兒記錄下我的解決思路锚烦,同時也給遇到了相同問題的人,一個思路方向帝雇。
問題描述
有一個查詢按鈕涮俄,點擊按鈕,彈出Ext.Window
窗體尸闸,查詢完后的數(shù)據(jù)展示在GridPanel
中彻亲。這兒有個需求,就是對查詢到的數(shù)據(jù)吮廉,右擊可以進行操作苞尝,右擊顯示的菜單用Ext.menu.Menu
。
我做完了之后宦芦,第一次打開這個window窗體宙址,右擊菜單能顯示。
但是關(guān)閉窗體后调卑,第二次去點開抡砂,右擊菜單就變成了小方塊大咱,無法正常顯示了。
我通過chrome瀏覽器調(diào)試發(fā)現(xiàn)注益,當(dāng)窗體出現(xiàn)后碴巾,可以查詢到這個實例,但是在關(guān)閉窗口后丑搔,就變成undefined厦瓢,說明了這個窗體被銷毀了。
但是查詢右擊菜單的時候發(fā)現(xiàn)低匙,新建窗體時會跟著一起被實例化旷痕,但是關(guān)閉后碳锈,卻不會被銷毀顽冶。由此我覺得這個應(yīng)該就是遇到了傳說中令人頭疼的ExtJS框架的ID沖突問題了。
解決方案
網(wǎng)上查了很多方法售碳,我選擇了從窗體銷毀這個點出發(fā)强重,解決問題。ExtJS窗體中的closeAction
屬性默認是close贸人,關(guān)閉窗體后就是銷毀組件了间景。那我就在窗體屬性里面加上closeAction: 'hide'
,讓關(guān)閉窗體的時候動作不是銷毀窗體艺智,而是隱藏倘要。
//搜索窗口
function createWindowSearch() {
return new Ext.Window({
id: 'windowSearch',
width: 1240,
height: Ext.getBody().getHeight() - 200,
title: '搜索',
modal: true,
layout: 'fit',
items: fnCreatesearchGrid(),
closeAction: 'hide' //關(guān)鍵屬性,關(guān)閉窗體的時候使窗體隱藏而不是銷毀
});
}
然后在實例化窗體的時候先增加一個判斷十拣,判斷這個窗體是否存在封拧,如果不存在就新建,存在的話直接show()
夭问,而不用重新創(chuàng)建一個泽西。
{
xtype: 'button',
text: '查找小區(qū)',
iconCls: 'icon-find',
handler: function () {
if (Ext.getCmp('windowSearch') == null) {
createWindowSearch();
Ext.getCmp('windowSearch').show();
} else {
Ext.getCmp('windowSearch').show();
}
}
}
這樣就讓窗體保持唯一,從而解決了因為ID的沖突造成的異常缰趋。