我已经尝试过找到有关该问题的任何内容,但我想我或者不确定如何在短时间内描述问题以找到解决方案,或者没有其他人在此之前我无法想到。也许我的想法也错了。
我有一个带有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页,然后点击详细信息并返回主页。
答案 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。