Wicket RepeatingView刷新/重新渲染?可能性? [列出缺少的物品]

时间:2013-05-07 13:06:49

标签: java wicket

我的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);

}

正如你所看到的,我唯一想要改变的是一个图像,一个链接图像。订阅或取消订阅服务。列表项保持不变。

我对检票口很新,也许这就是我的问题。

希望现在更好地解释一下。

4 个答案:

答案 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(); 

}

无论如何,谢谢你的帮助。