2011-04-01 163 views
1

我正在創建一個包含多個選項卡的網頁。爲了實現我使用的檢票口AjaxTabbedPanel和幾個AbstractTab。在每個選項卡中,我都有帶有數據的表格,我使用JavaScript腳本來使表格可排序。Wicket面板需要頁面刷新才能使用JavaScript腳本

public TabbedPage() { 
    List<ITab> tabs = new ArrayList<ITab>(); 
    tabs.add(new AbstractTab(new Model<String>("first tab")) { 
     public Panel getPanel(String panelId) { 
      return new TablePanel(panelId); 
     } 
    }); 

    tabs.add(new AbstractTab(new Model<String>("second tab")) { 
     public Panel getPanel(String panelId) { 
      return new TablePanel(panelId); 
     } 
    }); 

    add(new AjaxTabbedPanel("tabs", tabs)); 
} 

當我加載頁面時,默認選擇的標籤中的表格是可排序的。但是,只要我點擊任何鏈接跳轉到其他選項卡(包括已經選擇的選項卡),任何選項卡中的表格都不允許我對它們進行排序(包括之前工作的那個 - 表在默認選項卡中)。如果刷新頁面,我可以對錶格(刷新時選擇的表格)進行排序,但只要點擊任何切換標籤的鏈接,表格就會停止再次分類。任何想法爲什麼會發生?

編輯: 我發現,如果我通過TabbedPanel更換AjaxTabbedPanel我沒有這個問題。雖然我還不確定這是爲什麼。任何人都可以啓發我嗎?

add(new TabbedPanel("tabs", tabs)); 
+0

向我們展示一些代碼,我們可能會提供幫助。 – 2011-04-01 11:26:45

回答

2

排序由JavaScript表是最有可能被稱爲與特定DOM-ID功能,似乎是執行「的onLoad」。它然後訪問當前顯示的表格並且它工作。 通過Ajax更改Panel的內容不會觸發'onLoad',因此該函數不會再次執行。 TabbedPanel重新加載頁面並因此執行腳本。 由於動態生成的DOM-Ids,因此使用AjaxTabbedPanel選擇以前的可排序表不起作用。

您的解決方案是將AjaxCallDecorator添加到來自AjaxTabbedPanel的鏈接中,或者將腳本或至少將函數調用包含到您的選項卡面板中。

至少這一點,想到什麼沒有看到任何來源...

編輯: 你可能想看看The Wicket Wiki。有一個關於如何在點擊AjaxLink後調用js的描述。這正是應該解決您的問題。

摘要:只需添加

link.add(new AttributeAppender("onclick", new Model("myTableSortingScript();"), ";")); 

由AjaxTabbedPanel生成的鏈接。

0

沒有真正的想法,因爲我不知道代碼在做什麼,但我有我的Panel Manager類似的問題。基本上,如果你在內容中使用「innerhtml」腳本動態加載HTML到面板(div或其他元素)將不會執行。

爲了解決這個問題,我掃描了「腳本」標記的加載內容並使用DOM方法追加它們 - 這會運行腳本並使其可用。我的「負荷」的方法是:

// Load Content 
Panel.load = function(Content) { 

     // "null" the old (to clear it) 
    Panel.innerHTML = null; 

     // Load the content 
    Panel.innerHTML = Content; 

     // Load Scripts 
    var AllScripts = Panel.getElementsByTagName("script"); 
    var AllScriptsCnt = AllScripts.length; 
    for (var Cnt = 0; Cnt < AllScriptsCnt; Cnt++){ 
     var CurScript = document.createElement('script'); 
     CurScript.type = "text/javascript"; 
     CurScript.text = AllScripts[Cnt].text; 
     Panel.appendChild(CurScript); 
    }; 

}; 

同樣,不知道這是否是問題,但它聽起來目標幾乎從我的經驗。

1

在Wicket 6。0您可以將組件的基礎上運行的JavaScript:只覆蓋renderHead(IHeaderResponse響應)爲您的組件:

@Override 
public void renderHead(IHeaderResponse response) { 
    super.renderHead(response); 

    response.render(new OnLoadHeaderItem("initalizeMe(\"" + getMarkupId() + "\");")); 
} 

initializeMe(mycomponentId)每組件由AjaxTabbedPanel加載時執行。這也適用於標準TabbedPanel。