2011-04-01 177 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。