我正在创建一个带有多个选项卡的网页。为了实现这一点,我使用检票口AjaxTabbedPanel和几个AbstractTab。在每个标签中,我都有带有数据的表格,并且正在使用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));
}


当我加载页面时,默认情况下选中的选项卡中的表是可排序的。但是,一旦我单击任意链接以跳到其他选项卡(包括已选择的选项卡之一),则任何选项卡中的表都不允许我对它们进行排序(包括以前使用的选项卡-表格中的默认标签)。如果刷新页面,则可以对表(在刷新时选择的选项卡中的表)进行排序,但是,当我单击任何链接以切换选项卡时,表将再次失去可排序的功能。为什么会这样?

编辑:
我只是发现,如果我将AjaxTabbedPanel替换为TabbedPanel,则不会出现此问题。尽管我仍然不确定为什么。谁能启发我?

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

最佳答案

通过JavaScript对表进行排序最有可能是使用特定DOM-Id调用的函数,并且似乎是在“ onLoad”执行的。然后,它访问当前显示的表并开始工作。
通过Ajax更改Panel的内容不会触发“ onLoad”,因此不会再次执行该功能。 TabbedPanel重新加载页面,因此执行了脚本。
由于动态生成的DOM-Id,因此无法使用AjaxTabbedPanel选择先前的可排序表。

您的解决方案是将AjaxCallDecorator添加到AjaxTabbedPanel的链接中,或者将脚本或至少函数调用包含到选项卡式面板中。

至少这是我想到的而没有看到任何来源...

编辑:
您可能需要查看The Wicket Wiki。关于单击AjaxLink之后如何调用js的描述。这正是应该解决您的问题的方法。

摘要:只需添加

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


到由AjaxTabbedPanel生成的链接。

09-27 23:56