我遇到了AjaxPagingNavigator的问题。问题是当我按下"转到下一个"或者"转到上一个"而不是移动到下一页或上一页,它跳转1页。例如,如果我在第5页并按"转到下一个"而不是移动到第6页,它跳到第7页。你能协助我解决这个问题。哪里出错了?提前谢谢。
以下是代码:
public class OnlineBankAjaxPagingNavigator extends AjaxPagingNavigator {
PagingNavigation currentNavigation = null;
Map<String, Link<?>> firstLastMap = new HashMap();
Map<String, Link<?>> prevNextMap = new HashMap();
public OnlineBankAjaxPagingNavigator(String id, IPageable pageable) {
super (id, pageable);
}
public OnlineBankAjaxPagingNavigator(String id, IPageable pageable, IPagingLabelProvider labelProvider) {
super (id, pageable, labelProvider);
}
// forming navigation pages "first", "last"
protected Link<?> newPagingNavigationLink(String id, IPageable pageable, int pageNumber)
{
Link<?> ret = null;
if (firstLastMap.containsKey(id))
ret = firstLastMap.get(id);
else {
AjaxPagingNavigationLink navCont = new AjaxPagingNavigationLink(id + "Cont", pageable, pageNumber);
// add css for enable/disable link
long pageIndex = pageable.getCurrentPage() + pageNumber;
navCont.add(new AttributeModifier("class", new OnlineBankAjaxPageLinkCssModel(pageable,pageIndex, "navigator_bg")));
navCont.add(new AjaxPagingNavigationLink(id, pageable, pageNumber));
ret = navCont;
firstLastMap.put(id,ret);
}
return ret;
}
// forming navigation pages "prev", "next"
protected Link<?> newPagingNavigationIncrementLink(String id, IPageable pageable, int increment)
{
Link<?> ret = null;
if (prevNextMap.containsKey(id))
ret = prevNextMap.get(id);
else {
AjaxPagingNavigationIncrementLink navCont = new AjaxPagingNavigationIncrementLink(id+ "Cont", pageable, increment);
// add css for enable/disable link
long pageIndex = pageable.getCurrentPage() + increment;
navCont.add(new AttributeModifier("class",
new OnlineBankAjaxPageLinkIncrementCssModel(pageable, pageIndex)));
// change original wicket-link, so that it always generates href
navCont.add(new AjaxPagingNavigationIncrementLink(id, pageable, increment));
prevNextMap.put(id, navCont);
ret = navCont;
}
return ret;
}
// forming navigation pages - 1,2,3 ...
protected PagingNavigation newNavigation(IPageable pageable, IPagingLabelProvider labelProvider) {
PagingNavigation tmp;
String id;
if (currentNavigation==null) {
tmp = super.newNavigation(pageable, labelProvider);
id = tmp.getId();
tmp = null;
currentNavigation = new AjaxPagingNavigation (id, pageable, labelProvider) {
@Override
protected LoopItem newItem(int iteration) {
LoopItem item = super.newItem(iteration);
// add css for enable/disable link
long pageIndex = getStartIndex() + iteration;
item.add(new AttributeModifier("class",
new OnlineBankAjaxPageLinkCssModel(pageable,
pageIndex, "navigator_active")));
return item;
}
};
}
return currentNavigation;
}
};
html看起来像这样:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html xmlns:wicket="http://wicket.apache.org">
<head>
<title></title>
</head>
<body>
<wicket:panel>
<style>
.navigator_bg {
font-family: Verdana, Tahoma Arial;
font-style: normal;
color: #FFFFFF;
border: 1px solid black;
background-color: #00395D;
}
.navigatorBgDigit{
font-family: Verdana, Tahoma Arial;
color: #FFFFFF;
border: 1px solid black;
background-color: #00395D;
}
.navigator_active{
font-family: Verdana, Tahoma Arial;
font-style: normal;
background-color: #236B98;
color: #AFEEEE;
}
a.navigatorLink:link {
font-family: Verdana, Tahoma, Arial;
color: #FFFFFF;
text-decoration: none;
background-color: #00395D;
}
a.navigatorLink:visited {
font-family: Verdana, Tahoma, Arial;
color: #ffffff;
text-decoration: none;
background-color: #00395D;
}
a.navigatorLink:hover {
font-family: Verdana, Tahoma, Arial;
color: #FFFFFF;
text-decoration: none;
background-color: #00395D;
}
a.navigatorLink:active {
font-family: Verdana, Tahoma, Arial;
color: red;
text-decoration: none;
background-color: #00395D;
}
</style>
<table border='0'>
<tr class="navigator_bg">
<td width="18px" height="18px" align="center" valign="middle" wicket:id="firstCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="first" href="#"><<</a> </td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="prevCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="prev" href="#"><</a> </td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="navigation" class="navigatorBgDigit"><a wicket:id="pageLink" href="#" class="navigatorLink"><span wicket:id="pageNumber">1</span></a></td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="nextCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="next" href="#">></a> </td>
<td width="18px" height="18px" align="center" valign="middle" wicket:id="lastCont" class="navigator_bg"> <a class="navigatorLink" wicket:id="last" href="#">>></a> </td>
</tr>
</table>
</wicket:panel>
</body>
</html>
答案 0 :(得分:1)
此问题无法接受以下回答。请参阅更新部分以获得正确答案。
我在迁移到Wicket 7时遇到了这个问题。迁移的代码没有任何变化,但没有正常工作。不仅存在上述问题。如果我点击任何导航页面链接 - &#34;访问被拒绝&#34;页面出现了。经过一些研究,我已经意识到,当点击一些链接时,有两个相同的事件发送,所以你递增页面两次,或者转到页面,然后链接,点击消息和第二个请求试图访问这个消失的链接,所以&#34;访问被拒绝&#34;页面出现了。
我真的不知道这是一个错误,还是我做错了什么,但我没有找到有关此问题的任何信息。因此,我已经为寻呼链接提供了一种解决方法。
如果您在呈现页面后查看AjaxPagingNavigationIncrementLink
和AjaxPagingNavigationLink
标记 - 您会看到,此类组件具有调用链接侦听器的href="./?3-8.ILinkListener-..."
之类的内容。如果我们删除此href
源,那么组件将正常工作并仅执行一个ajax请求。因此,使用此类代码覆盖onComponentTag
和AjaxPagingNavigationIncrementLink
所有出现的AjaxPagingNavigationLink
方法:
/**
* Overridden to workaround wicket 7 behavior, which proccessed an error, when ajax navigation is used.
*/
@Override
protected void onComponentTag ( final ComponentTag tag )
{
super.onComponentTag ( tag );
if ( !Strings.isEmpty ( tag.getAttribute ( "href" ) ) ) // checking if href is not null or empty with org.apache.wicket.util.string.Strings class.
{
tag.put ( "href", "" ); //removing any contents of the href option.
}
}
注意,AjaxPagingNavigation
也有方法newPagingNavigationLink(...)
。
注意2,在Wicket 6链接中也有href
选项,它可以正常工作。
无论如何,希望这会有所帮助,wicket开发人员会评论这个答案以便更好地理解:)。
更新
不幸的是,事实证明这个答案没有问题:)。
问题在于newPagingNavigationLink
和newPagingNavigationIncrementLink
方法的实施。
在这种方法中,您将一个链接放置到另一个,这会产生您的奇怪行为。所以,你必须摆脱它并返回简单的AjaxPagingNavigationLink
和增量链接。您可以将您的行为添加到此链接。
我认为您希望通过OnlineBankAjaxPageLinkIncrementCssModel
更新容器样式,但不能将此类链接放在任何容器中(因为实际上已经添加到PagingNavigator#onInitialize
方法中)。因此,您只能使用此行为更新此链接,或使用javascript。还有另一个选项可以执行您想要的操作,但这是另一个问题(提示:您必须覆盖onInitialize
和add
方法。)
另外,为什么要决定将链接缓存到HashMap
?这样做没有任何好处,因为此类链接仅在OnlineBankAjaxPagingNavigator
生命周期中创建一次。所以你也可以删除这个缓存。