Wicket(1.6)无状态形式重置分页

时间:2016-03-21 12:36:03

标签: ajax forms wicket paging stateless

我已经尝试过找到有关该问题的任何内容,但我想我或者不确定如何在短时间内描述问题以找到解决方案,或者没有其他人在此之前我无法想到。也许我的想法也错了。

我有一个带有ajax支持面板的无状态wicket 1.6表单(带有输出id的WebMarkupContainer)。该面板包含一个带分页导航器的数据视图。 dataview本身由DataProvider填充。

面板显示数据库中的一些条目,下面是导航器。通过单击导航器上的任何页面,面板将刷新(ajax)并显示该页面中的内容。浏览器不会重新呈现页面本身。

当我现在离开页面时,导航到另一个内部页面(所以基本上以任何方式离开dataview-panel-page)打开一个详细信息页面,然后返回到该数据视图页面,导航器被重置(因为我认为这是无国籍的。导航器无法记住要显示的页面,并再次从第一页的顶部开始。

问题是:我该如何解决这个问题?我想i.ex.导航到第2页,然后临时离开页面以获取另一个内部页面。返回时我想要在第2页,专注于我之前点击“详细信息”链接的记录。当我在新的浏览器选项卡中打开新页面时,也会发生这种情况。

谢谢!

以下是一些代码:

    final WebMarkupContainer gamesPanel = new AjaxContainer("gamesPanel");
    final DataView<Game> dataView =
            new GameDataView("gameOverview", targetCurrencyModel, searchTextModel, gameFilterModel,
                    new GameDataProvider(searchTextModel, gameFilterModel, targetCurrencyModel));
    dataView.setItemsPerPage(ITEMS_PER_PAGE);
    gamesPanel.add(dataView);

    final XNPagingNavigator navigator = new XNPagingNavigator("navigator", dataView);
    navigator.setOutputMarkupId(true);
    add(navigator);

你们可以尝试我的意思:我正在谈论的页面是http://www.xbox-now.de。只需导航到第2页,然后点击详细信息并返回主页。

3 个答案:

答案 0 :(得分:0)

我认为您在点击导航栏时可能会使用History API来推送新状态。在状态的新URL中,您可以包含一个参数,该参数指示当前导航器页面的索引。 您可以自定义AJAX链接,以便在用户单击时执行此操作。

有关历史记录API的详细信息,请参阅Updating address bar with new URL without hash or reloading the page

答案 1 :(得分:0)

我在NoWicket框架中解决了这个问题,引入了一个模型识别页面缓存,当页面模型中的hashcode / equals匹配时,它会重用页面实例。你可以在GitHub repo中看到实现,try this implementation of the IPageFactory wrapper作为起点,但它涉及的代码更多,只需检查代码,调试示例并导航代码以便更好地理解它以便应用它到您的申请。通过在文档网站(您也可以在本地调试)中尝试此数据表示例来查看您的用例:http://invesdwin.de/nowicket/ajaxdatatable

尝试更改分页索引,导航到其他页面并导航回数据表示例页面。你仍会看到你留在那里的分页索引。

答案 2 :(得分:0)

谢谢你们的回复。我现在用另一种方式完成了它。使用here中的基本代码并以某种方式对其进行修改。添加了一些不错的css AttributeModifiers来指示实际页面:

item.add(new AttributeModifier("class", new PageLinkCssModel(pageable, pageIndex, "active")));

然后我修改了一些代码来添加或重置页面参数,它只使用了一次,2)保留了在添加自己的页面参数之前的所有实际页面参数。所以我现在只是附加页码。这样我就可以像www.foo.bar/path/path/path一样保留我最初的挂载路径。完整的URL现在看起来像:www.foo.bar/path/path?page = 123。

要将我输入的页面(即page = 5)传递给数据提供者,我只需要覆盖提供者迭代器。它应该从我输入的页面开始。由于丑陋的生成的导航器URL(对搜索引擎优化极为不利),我现在拥有漂亮的网址,这些网站独立工作,之前不可能。这也是我无法回到正确页面的原因。 wicket无法查找导航器URL。

new DataView<GamePrice>("gamePriceOverview", new GameDetailDataProvider(gameId, targetRegion) {
                @Override
                public Iterator<GamePrice> iterator(final long first, final long count) {
                    return super.iterator(ITEMS_PER_PAGE * getCurrentPage(), count);
                }

getCurrentPage()来自基本模板并获取输入的实际页码(如果输入了一个):

public long getCurrentPage() {
    // -1 weil zero based
    return getRequest().getQueryParameters().getParameterValue("page").toString() != null
            ? (getRequest().getQueryParameters().getParameterValue("page").toLong() - 1)
            : 0;
}

因此,不要使用丑陋的SEO不友好的URL,这些URL也不兼容独立工作(直接输入生成的URL),我现在拥有与预期相同的URL以及添加的页面参数。

现在的网址如下: http://localhost:8080/game/4249/de/doom-preorder?page=2

之前的

网址: 本地主机:8080 /游戏/ 4249 / DE /末日序0-1.ILinkListener-gamePrices导航器导航-2- pageLink

如果我现在从详细页面返回到主索引和#34; Bookmarkable-Navigator&#34;,我正确地回到页面和我离开它的位置(因为可收藏的页面链接)。

这就是我如何通过一个很好的奖励来实现这个问题:用户和SEO友好的URL。