Wicket RepeatingView опресняване / повторно изобразяване? Възможности? [Липсващи елементи в списъка]

Имам малък проблем с моето приложение за wicket.

Проблемът е в страница, наречена OverviewPage, тук има някои панели като ListPanel, в който е моят RepeatingView.

Този RepeatingView (списък) има някои елементи с бутон за всеки елемент, ако натисна бутона, ще бъда пренасочен към друга страница (RegistrationPage) и някои промени в RepeatingView (списък) са направени.

Ако сега навигирам обратно към OverviewPage с RepeatingView (списък), списъкът е точно същият като преди. Направих промени в елементите от списъка, но те не се виждат. (Не натиснах бутона за връщане назад на браузъра, щракнах върху връзка от моята навигация)

Знам, че случаите на уикет страници продължават през сесията. Мога ли да кажа на 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);

}

Както можете да видите, единственото нещо, което искам да променя, е едно изображение, изображение на връзка. за абониране или отписване на услуга. елементите от списъка остават същите.

Аз съм съвсем нов в wicket и може би това е моят проблем.

Надяваме се, че сега е по-добре обяснено.


person DaUser    schedule 07.05.2013    source източник


Отговори (4)


Осигурете на своя панел за действие LoadableDetachableModel вместо нормално Model. LDM винаги извлича нови свежи обекти, така че това може да реши проблема ви. Вероятно ще трябва да преработите кода си доста.

Последният път имаше подобен проблем с DataTable и това помогна.

person Robert Niestroj    schedule 07.05.2013
comment
Повече информация за LDM тук -cwiki.apache.org /КАРИТКА/ - person Gwyn Evans; 08.05.2013

Тук трябва да се различавате. Структурата на страница/компонент се конструира веднъж и след това това дърво от компоненти се иска да изобрази за всяко показване на страница (опресняване). Някои повторители запазват списъка с компоненти за след процеса на изобразяване, така че без значение какво правите със списъка (промяна на елементите в него), това няма да има ефект върху изобразения изход.

Други повторители (RefreshingView) отхвърлят всички компоненти след рендиране и създават отново компонентите за всеки процес на рендиране, следователно, ако промените списъка за поддръжка, тези промени ще бъдат отразени в изобразения изход.

Освен това не се запазва състояние извън сесиите. Ако сесията е затворена, не можете да се върнете към старото състояние на страницата.

Без някакъв код не мога да ви кажа защо виждате старо състояние, след като щракнете върху обратната връзка.

person bert    schedule 07.05.2013

Обикновено използвам 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();
        ...

След това трябва да можете да използвате вашите променливи за артикул и услуга както преди. Освен това в този момент можете да погледнете или с регистратор, или с програма за отстраняване на грешки, за да проверите дали вашата база данниService.getAllServices връща правилно актуализирания списък.

person OnesAndZeros    schedule 07.05.2013

Сега работи.

Това беше моя грешка. Списъкът може да бъде актуализиран, НО не и при моите условия:

Използвах SpringSecurity и Wicket в комбинация, за да постигна удостоверяване на потребителя. Потребител, удостоверен чрез ldap в моята wicketSession. Удостоверяването съдържа потребителски обект с всички необходими неща (име, sn, групи, имейл и др.).

В моя RepeatingView, по-точно в моя ActionPanel, направих някои действия, за да променя LDAP записа на потребител, като го добавя към други групи.

Проблемът сега е: Удостоверяването, което държи потребителския обект, държи СТАРИЯ немодифициран потребителски обект. (Запомнете: промених потребителските групи.)

Ето защо не видях никакви промени в моите ListItems, състоянието ми беше като...

if (user is in group) {

   addUnSubscribeLink(); 

} else {

   addSubscribeLink(); 

}

Благодаря за помощта все пак.

person DaUser    schedule 08.05.2013