我的wicket应用程序出了点问题。
问题出现在名为OverviewPage的页面上,这里有一些像ListPanel这样的面板,我的RepeatingView就是这样。
这个RepeatingView(List)有一些项目,每个项目都有一个按钮,如果按下按钮,我将被重定向到另一个页面(RegistrationPage)并完成对RepeatingView(列表)的一些更改。
如果我现在使用RepeatingView(列表)导航回OverviewPage,则列表与之前完全相同。我对列表项进行了更改,但它们不可见。 (我没有按下浏览器后退按钮,我点击了导航链接)
我知道wicket页面的实例在会话中持续存在。我可以告诉wicket再次重新呈现此页面/列表吗?有什么可能性?任何人都可以吗?
谢谢
编辑:
以下是持有RepeatingView的小组:
/**
*
* Constructor...
*
* @param id
*/
public ServiceListPanel(String id) {
super(id);
RepeatingView repeating = new RepeatingView("repeating");
add(repeating);
int index = 0;
// add all services to the list
for (Service service : databaseService.getAllServices()) {
AbstractItem item = new AbstractItem(repeating.newChildId());
repeating.add(item);
item.add(new ActionPanel("actions", new Model<Service>(service)));
item.add(new Label("name", service.getName()));
item.add(new Label("description", service.getDescription()));
item.add(new Label("country", service.getCountry()));
final int idx = index;
item.add(AttributeModifier.replace("class", new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return (idx % 2 == 1) ? "even" : "odd";
}
}));
index++;
}
}
下一个是应该发生变化的ActionPanel:
/**
*
* Constructor...
*
* @param id
* @param model
*/
public ActionPanel(String id, final IModel<Service> model) {
super(id);
Link<?> link;
ContextImage image;
final ServiceUserDetails user = getSession().getUser();
final Service service = model.getObject();
// Check for groups and customize the link to subscribe or unsubscribe
if (checkUserGroups(user, service)) {
image = new ContextImage("img", "template/img/unsubscribe.gif");
link = new Link<Void>("select") {
/** */
private static final long serialVersionUID = -2153508505463870485L;
/**
*
* @see org.apache.wicket.markup.html.link.Link#onClick()
*/
@Override
public void onClick() {
ServiceRequest req = new ServiceRequest(service, user, "DELETE");
serviceProcessor.handleServiceRequest(req);
setResponsePage(new RegistrationPage());
}
};
} else { // user is not in group
image = new ContextImage("img", "template/img/subscribe.gif");
link = new Link<Void>("select") {
/** */
private static final long serialVersionUID = -2153508505463870485L;
/**
*
* @see org.apache.wicket.markup.html.link.Link#onClick()
*/
@Override
public void onClick() {
ServiceRequest req = new ServiceRequest(service, user, "PUT");
serviceProcessor.handleServiceRequest(req);
setResponsePage(new RegistrationPage());
}
};
}
link.add(image);
add(link);
}
正如你所看到的,我唯一想要改变的是一个图像,一个链接图像。订阅或取消订阅服务。列表项保持不变。
我对检票口很新,也许这就是我的问题。
希望现在更好地解释一下。
答案 0 :(得分:3)
为您的actionPanel提供LoadableDetachableModel
而非普通Model
。 LDM总是获取新的新对象,因此这可以解决您的问题。您可能需要对代码进行重构。
上次有一个与DataTable有类似问题但它有帮助。
答案 1 :(得分:2)
你必须在这里有所不同。页面/组件的结构构造一次,并且要求为每个页面显示(刷新)呈现该组件树。一些转发器在渲染过程之后保留了一个组件列表,因此无论您对List做什么(更改其中的元素),它都不会对渲染输出产生影响。
其他转发器(RefreshingView)会在渲染后丢弃所有组件,并为每个渲染过程重新创建组件,因此,如果更改了支持列表,这些更改将在渲染输出中重新显示。
此外,没有任何州保持在会议之外。如果会话已关闭,则无法返回旧页面状态。
如果没有一些代码,我就无法告诉您为何在点击后退链接后看到旧状态。
答案 2 :(得分:1)
我通常会将ListView用于几乎所有的中继器,因为它非常简单。要使用ListView,我会替换代码的以下行(注意:我跳过了一些你可以留在原地的行并突破了databseService.getAllServices()
,这样你就可以验证它在那时实际更新了):
RepeatingView repeating = new RepeatingView("repeating");
for (Service service : databaseService.getAllServices()) {
AbstractItem item = new AbstractItem(repeating.newChildId());
repeating.add(item);
...
有了这个:
List<Service> serviceList = databaseService.getAllServices();
ListView repeating = new ListView("repeating", serviceList) {
@Override
protected void populateItem(ListItem item) {
Service service = (Service) item.getModelObject();
...
然后您应该可以使用您的商品&amp;服务变量与以前相同。此外,此时您可以使用记录器或调试器来验证您的databaseService.getAllServices是否正在返回正确更新的列表。
答案 3 :(得分:1)
现在有效。
这是我的错。列表可以更新,但不是在我的条件下:
我结合使用SpringSecurity和Wicket来实现用户身份验证。用户通过我的wicketSession中的ldap进行了验证。 Autentication保存一个用户对象,其中包含我需要的所有内容(名称,sn,组,电子邮件等等)。
在我的RepeatingView中,更准确地说,在我的ActionPanel中,我做了一些操作,通过将用户添加到其他组来修改用户的LDAP条目。
现在的问题是:保存用户对象的身份验证保存OLD未修改的用户对象。 (请记住:我更改了用户组。)
这就是为什么我没有看到我的ListItems有任何变化,我的情况就像......
if (user is in group) {
addUnSubscribeLink();
} else {
addSubscribeLink();
}
无论如何,谢谢你的帮助。