2014-01-14 37 views
0

我有一個ListView,它顯示Panel s列表,一個在另一個之下。每個面板都有一個按鈕(通過AjaxLink實現),用於關閉面板並將其從列表中移除。Wicket AjaxLink JavaScript處理程序顯示奇怪的行爲

這是ListView控件是如何initalized以及如何面板創建:

panelsList = new ArrayList<MyPanel>(); 
pnlContainer = new WebMarkupContainer("pnlContainer"); 

ListView<MyPanel> pnlItems = new ListView<MyPanel>("pnlItems", panelsList) { 
    @Override 
    protected void populateItem(final ListItem<MyPanel> item) { 
     item.add(item.getModelObject()); 
     item.add(new AjaxLink<Void>("pnlClose") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       panelsList.remove(item.getModelObject()); 
       target.add(pnlContainer); // repaint panel container 
      } 
     }); 
    } 
}; 

pnlContainer.setOutputMarkupId(true); 
pnlContainer.add(pnlItems); 
add(pnlContainer); 

到目前爲止是這種情況 - 觸發增加新的面板(通常也AjaxLink S)的行動做什麼,他們應該和新面板被添加並正確顯示。但是我在關閉按鈕完全工作時遇到問題。

請參閱下面的步驟:

1)我啓動服務器,然後導航到主頁。 ListView最初由一個面板填充。此面板的

關閉按鈕的代碼:

<a wicket:id="pnlClose" id="pnlClose7" href="javascript:;">Close</a> 

搜索的頁面代碼pnlClose7發現下面的JavaScript代碼,使預期的按鈕工作:

Wicket.Ajax.ajax({"u":"./?0-1.IBehaviorListener.0-pnlContainer-pnlItems-0-pnlClose","e":"click","c":"pnlClose7"});; 

:我現在不按按鈕,如果我願意,它會按預期工作(經過全面測試)。

2)我觸發打開第二面板的動作。按預期在第一個面板下面顯示面板。

第一面板的關閉按鈕:

<a wicket:id="pnlClose" id="pnlClosef" href="javascript:;">X</i></a> 

關閉按鈕第二面板:

<a wicket:id="pnlClose" id="pnlClose10" href="javascript:;">X</i></a> 

但現在,無論是搜索pnlClosef也不pnlClose10發現一些javascript碼。按鈕(都!)不起作用。我仍然可以找到pnlClose7的JavaScript代碼。

3)我通過按F5刷新頁面。

按鈕ID更改爲pnlClose1apnlClose1b。這兩個ID都有javascript對應和工作。

4)我按下第一個按鈕(上圖,ID pnlClose1a)。小組按預期關閉。

其餘按鈕的ID更改爲pnlClose1c,同樣沒有javascript對應項。Javascript code for pnlClose1a and pnlClose1b仍存在。

爲了長話短說,我的AjaxLink的javascript處理程序似乎有害羞問題,並且只在按F5或以任何其他方式重新加載整個頁面後纔會出現。我想這是因爲重繪pnlContainer會改變當前面板的ID - 但爲什麼鏈接的javascript不會同時更新?有沒有什麼我可以改變我的代碼來更新整個頁面而無需重新加載?

奇怪的是,我很確定這工作之前...但我檢查了整個班級的歷史,並找不到任何重大變化,將觸發這一點。 ListView-代碼主要是靜態的,因爲我添加了它。

+0

嘗試設置爲true:http://ci.apache.org/projects/wicket/apidocs/6.0.x/org/apache/wicket/markup/html/list/ListView.html#setReuseItems%28boolean%29 –

+0

哎呀,忘了補充說...已經嘗試過,沒有效果。在附加的說明中,頁面設置爲'isVersioned(){return false;}',如果這有什麼區別的話。但我嘗試了版本控制,但它也不起作用。與版本控制和重複使用項目相同。 – sina

回答

0

我有過類似的問題。如果您在頁面或面板html文件中使用了任何硬編碼的JavaScript代碼(使用<腳本>標記),請將其刪除並在面板的renderHead中設置該js代碼。

+0

快速和骯髒的測試 - 我剛剛刪除了包含硬編碼javascript的所有組件(上面提到的任何面板都沒有受到影響)。沒有效果:( – sina

+0

我發現了這個解決方案,一個完全無關的(看起來很無辜的)組件在創建時向客戶端推送一個空的javascript。不知道開發人員是否推出了這個推送,但是打破了整個頁面。接受你的答案,因爲它是指向正確方向的人。Wicket似乎對javascript ^^敏感 – sina