Wicket 1.4.9 не может использовать AjaxRequestTarget из модального режима после ошибки обратной связи! - PullRequest
0 голосов
/ 06 августа 2010

Я создаю простое веб-приложение для калитки, использующее описание этой проблемы, когда я устанавливаю значение true в TextField и отправляю с нулевым значением в Textfield.У меня есть сообщение панели обратной связи (это звучит хорошо), но в моем случае я хочу получить свои данные из модальных окон и отправить обратно в эту форму, но он не может AjaxRequestTarget обновить данные TextField и не может ничего вводить в другое текстовое поле. Я не могу решитьс этой проблемой. пожалуйста, помогите мне. но когда я снова запускаю веб-приложение и использую модальные окна, я могу установить свои данные в текстовом поле.

Это мой пример кода

User Entity:

public class User implements Serializable {

private String username;
private String password;

public User(String username, String password){
    this.username = username;
    this.password = password;
}

public User() {
    // TODO Auto-generated constructor stub
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getPassword() {
    return password;
}

public void setPassword(String password) {
    this.password = password;
}
}

Моя страница

public class FormPage extends WebPage{

private User user;
private ModalWindow modal;
private TestForm form;

public FormPage() {
    user = new User();

    modal = new ModalWindow("modal");
    modal.setOutputMarkupId(true);
    modal.setInitialHeight(300);
    modal.setInitialWidth(300);
    add(modal);

    form = new TestForm("form");
    add(form);
}

private class TestForm extends Form {

    private FeedbackPanel feedback;
    private TextField<String> username;
    private AjaxLink popupButton;
    private AjaxButton submitButton;
    private TextField<String> password;

    public TestForm(String id) {
        super(id);

        feedback = new FeedbackPanel("feedback");
        feedback.setOutputMarkupId(true);
        add(feedback);

        username = new TextField<String>("username", new PropertyModel<String>(FormPage.this, "user.username"));
        username.setOutputMarkupId(true);
        username.setRequired(true);
        add(username);

        password = new TextField<String>("password", new PropertyModel<String>(FormPage.this, "user.password"));
        password.setOutputMarkupId(true);
        password.setRequired(true);
        add(password);

        popupButton = new AjaxLink("popupButton") {

            @Override
            public void onClick(AjaxRequestTarget target) {
                UserPopup popup = new UserPopup(modal.getContentId()) {

                    @Override
                    public void onSuccess(AjaxRequestTarget target, User user) {
                        FormPage.this.user = user;
                        target.addComponent(username);
                        target.addComponent(password);
                        modal.close(target);
                    }
                };
                modal.setContent(popup);
                modal.show(target);
            }
        };
        add(popupButton);

        submitButton = new AjaxButton("submitButton", this) {

            @Override
            protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
                // TODO Auto-generated method stub

            }

            @Override
            protected void onError(AjaxRequestTarget target, Form<?> form) {
                target.addComponent(feedback);
            }
        };
        add(submitButton);

    }

}

}

мое всплывающее окно:

public abstract class UserPopup extends Panel{

private User user;

public UserPopup(String id) {
    super(id);

    user = new User("name","pass");

    add(new AjaxLink("userLink"){

        @Override
        public void onClick(AjaxRequestTarget target) {
            onSuccess(target, user);
        }


    });
}

public abstract void onSuccess(AjaxRequestTarget target,User user);

}

1 Ответ

0 голосов
/ 11 августа 2010

попробуйте это.Метод onSuccess, задайте в качестве объекта модели поля вашего имени пользователя и пароля.

@Override
                public void onSuccess(AjaxRequestTarget target, User user) {
                    FormPage.this.user = user;
                    username.setModelObject(user.getUsername());
                    password.setModelObject(user.getPassword());
                    target.addComponent(username);
                    target.addComponent(password);
                    modal.close(target);
                }

У меня был похожий вариант использования, и он работал.Вы, кажется, боретесь со своим английским, и поэтому я, возможно, не понял ваш вопрос хорошо.

Ниже приведен мой код с похожей проблемой.

public class ReleaseDetailPanel extends Panel {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    private Form<Release> frmRelease ;

    private TextField<String> txtName ;

    private TextArea<String> txtDescription;

    private TextField<Project> txtProject;

    private AjaxLink<String> lnkLookupProject ;

    private ModalWindow mdProjectLookup ;

    @Inject
    private Dao dao ;


    public ReleaseDetailPanel(String id, Release release) {
        super(id);

        frmRelease = new Form<Release>("frmRelease", new Model<Release>(release)){
            /**
             * 
             */
            private static final long serialVersionUID = 8075962334880413343L;

            protected void onSubmit() {
                Release r = this.getModelObject();
                dao.save(r);
            };
        };

        txtName = new TextField<String>("txtName", new PropertyModel<String>(release, "name"));
        frmRelease.add(txtName);

        txtDescription = new TextArea<String>("txtDescription", new PropertyModel<String>(release, "description"));
        frmRelease.add(txtDescription);

        txtProject = new TextField<Project>("lstProject", new PropertyModel<Project>(release, "project") );
        frmRelease.add(txtProject);
        txtProject.setEnabled(false); 
        txtProject.setOutputMarkupId(true);

        lnkLookupProject = new AjaxLink<String>("lnkLookupProject"){
            /**
             * 
             */
            private static final long serialVersionUID = -1014715631761886636L;

            @Override
            public void onClick(AjaxRequestTarget target) {
                mdProjectLookup.show(target);
            }


        };
        frmRelease.add(lnkLookupProject);
        add(frmRelease);

        mdProjectLookup = new ModalWindow("mdProjectLookup");
        mdProjectLookup.setContent(new ProjectListPanel(mdProjectLookup.getContentId()){

            @Override
            public Component getGridMenu(String id) {

                return new Label(id);
            }

            @Override
            public Component getGridItemMenu(String componentId, final Project project) {
                return new LabeledAjaxFallbackLink(componentId, "Select"){

                    /**
                     * 
                     */
                    private static final long serialVersionUID = 1L;

                    @Override
                    public void doClick(AjaxRequestTarget target) {
                        txtProject.setModelObject(project);
                        target.addComponent(txtProject);
                        mdProjectLookup.close(target);
                    }


                };

            }

        });

        add(mdProjectLookup);
    }
...