В Wicket, как реализовать Форму с Ajax Paginated List флажками? - PullRequest
0 голосов
/ 10 августа 2011

На моей странице Wicket у меня есть форма с парой TextFields и разбитым на страницы списком флажков, iplemenet с dataview и поставщиком данных. Я использовал этот пример Checkgroup .

Я перечислил свой источник ниже. Проблема в том, что когда я выбираю несколько элементов на странице 1, а затем перехожу на страницу 2 и затем возвращаюсь на страницу 1 с помощью AjaxPagingNavigator, выбор теряется: элементы, которые были проверены на странице 1, изначально не имеют флажка "больше. Что мне делать, чтобы элементы, выбранные на странице, не терялись, когда AjaxPagnigaion используется для обхода списка?

public final class AjaxFormWithPaginatedCheckBoxPage extends BasePage {

static Logger logger = Logger.getLogger(AjaxFormWithPaginatedCheckBoxPage.class);
private Person person = new Person();
int counter = 0;

WebMarkupContainer webMC;
static List<Person> pList=Person.getPersons(100); 
int maxListCount=5;
DataView dv;
CheckGroup group;
public AjaxFormWithPaginatedCheckBoxPage() {
    super();
    final Form form = new Form("form", new CompoundPropertyModel(person)) {

        protected void onSubmit() {
            logger.info("form recived");
            logger.info(" person name " + person.getName());

            setResponsePage(new AjaxTogglePanelTestPage());
        }
    };
    final TextField name = new TextField("name");
    final TextField age = new TextField("age");
    form.add(name);
    form.add(age);


    group=new CheckGroup("group", new ArrayList());        
    form.add(group);

    webMC= new WebMarkupContainer("webMC");
    webMC.setOutputMarkupId(true);

    //PersonDataProvider personDataProvider= new PersonDataProvider();
    SortablePersonDataProvider personDataProvider=new SortablePersonDataProvider(pList);
    dv = new DataView<Person>("persons", personDataProvider) {

        @Override
        protected void populateItem(Item<Person> item) {
            //AttributeModifier am = new AttributeModifier("src", true, item.getModel());
            //item.add(new Radio("radio", item.getModel()));
            item.add(new Check("check", item.getModel()));
            item.add(new Label("id", new PropertyModel(item.getModel(), "id")));                
            item.add(new Label("name", new PropertyModel(item.getModel(), "name")));                
            item.add(new Label("age", new PropertyModel(item.getModel(), "age")));                
        }


    };
    dv.setItemsPerPage(maxListCount);


    webMC.add(new AjaxFallbackOrderByBorder("orderByID", "id", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });

    webMC.add(new AjaxFallbackOrderByBorder("orderByName", "name", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });
    webMC.add(new AjaxFallbackOrderByBorder("orderByAge", "age", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });


    webMC.add(dv);        
    webMC.add(new AjaxPagingNavigator("navigator",dv));
    group.add(webMC);

    AjaxButton ab = new AjaxButton("ajax-button", new PropertyModel<String>(this,
            "counter"), form) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            counter++;
            logger.info("ajx form recived");
            logger.info("ajx person name " + person.getName());

            target.addComponent(this);

        }
    };
    form.add(ab);
    form.setDefaultButton(ab);

    add(form);        
}
}

Ok - это обновленный код РАБОЧЕГО РЕШЕНИЯ, основанный на ответе ниже. Спасибо.

public final class AjaxFormWithPaginatedCheckBoxPage extends BasePage {
static Logger logger = Logger.getLogger(AjaxFormWithPaginatedCheckBoxPage.class);
private Person person = new Person();
int counter = 0;

WebMarkupContainer webMC;
static List<Person> pList=Person.getPersons(100); 
int maxListCount=5;
DataView dv;


Set<Person> selectedPersons= new HashSet<Person>();


public AjaxFormWithPaginatedCheckBoxPage() {
    super();
    final Form form = new Form("form", new CompoundPropertyModel(person)) {

        protected void onSubmit() {
            logger.info("form recived");
            logger.info(" person name " + person.getName());
            for(Person p: selectedPersons){
                logger.info(" selected "+ p.getName());
            }

            setResponsePage(new AjaxTogglePanelTestPage());

        }
    };
    final TextField name = new TextField("name");
    final TextField age = new TextField("age");
    form.add(name);
    form.add(age);


    //group=new CheckGroup("group", new ArrayList());        
    //form.add(group);
    /*
    group.add(new AjaxFormChoiceComponentUpdatingBehavior(){

        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            logger.info(" AjaxFormChoiceComponentUpdatingBehavior invoked .. ");
             target.addComponent(webMC);

        }

    });
    */


    webMC= new WebMarkupContainer("webMC");
    webMC.setOutputMarkupId(true);


    //PersonDataProvider personDataProvider= new PersonDataProvider();
    SortablePersonDataProvider personDataProvider=new SortablePersonDataProvider(pList);
    dv = new DataView<Person>("persons", personDataProvider) {

        @Override
        protected void populateItem(final Item<Person> item) {


            //item.add(new  Check("check", item.getModel()));
            AjaxCheckBox ajc=new  AjaxCheckBox("check", new PropertyModel(item.getModel(), "id")) {

                @Override
                protected void onUpdate(AjaxRequestTarget art) {
                    logger.info("onupdate called");
                        String value=getValue();
                        if(value==null){
                            logger.info("dunno what to do ..");
                            throw new IllegalArgumentException(" ajax check box returned null");
                        }    

                        Person op=((Person)(item.getDefaultModelObject()));
                        logger.info("person "+ op.getName() +" was "+ person.isSelected() );
                            boolean bret= Strings.isTrue(value);
                            if(bret==false){
                                logger.info(" ... UN-selected");
                                //((Person)(item.getDefaultModelObject())).setSelected(false);
                                selectedPersons.remove(op);
                            }
                            else{
                                logger.info("....selected");
                                //((Person)(item.getDefaultModelObject())).setSelected(true);
                                selectedPersons.add(op);
                            }
                        }                                    

            };
            item.add(ajc);
            item.add(new Label("id", new PropertyModel(item.getModel(), "id") ) );                
            item.add(new Label("name", new PropertyModel(item.getModel(), "name")));                
            item.add(new Label("age", new PropertyModel(item.getModel(), "age")));                
        }


    };
    dv.setItemsPerPage(maxListCount);


    webMC.add(new AjaxFallbackOrderByBorder("orderByID", "id", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });

    webMC.add(new AjaxFallbackOrderByBorder("orderByName", "name", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });
    webMC.add(new AjaxFallbackOrderByBorder("orderByAge", "age", personDataProvider)
    {
        @Override
        protected void onSortChanged()
        {
            dv.setCurrentPage(0);
        }

        @Override
        protected void onAjaxClick(AjaxRequestTarget target) {
            target.addComponent(webMC);
        }
    });


    webMC.add(dv);        
    webMC.add(new AjaxPagingNavigator("navigator",dv));
  //  group.add(webMC);

    AjaxButton ab = new AjaxButton("ajax-button", new PropertyModel<String>(this,
            "counter"), form) {

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            counter++;
            logger.info("ajx form recived");
            logger.info("ajx person name " + person.getName());

            target.addComponent(this);

        }
    };

    form.add(webMC);
    form.add(ab);
    form.setDefaultButton(ab);

    add(form);        

}
}

1 Ответ

0 голосов
/ 10 августа 2011

Каждый раз, когда вы покидаете страницу, используя навигатор по страницам, вы не отправляете форму, не передавая данные, не меняя модели и не получая при этом чистого листа по возвращении. Самый простой способ обойти это - использовать AjaxCheckbox es вместо ваших обычных флажков. Если это невозможно, вам нужно изменить свои нумерацию страниц для отправки формы.

...