andPat
andPat

Reputation: 4522

Container Visibility control on Change behavior of text field in Wicket 1.4

I've a container which output markup placeholder tag is set to true. I want to display it only if I digit in a certain text field a certain string. For example if I digit "show" in text field, container appears, if I digit "hide" it disappears. I made this code:

container.setOutputPlaceHolderTag(true);
container.setOuputMarkupId(true);

textfield.add(new OnChangeAjaxBehavior() {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                form.modelChanged();

                if ("SHOW".equals(textfield.getModelObject())) {
                    container.setVisible(true);
                } else {

                    container.setVisible(false);
                }
                target.addComponent(container);
}

this code works only if I write SHOW, BUT when I write another string it doesn't disappear. To make it disappear I've to refresh the whole form they are into (and I don't want it). How can I solve this problem??

some details: all component I'm refering to are in a form, and only if I refresh the form setVisible(false) works. From now only setVisible(true) works, it seems the container stucks on visibility true.

Upvotes: 0

Views: 1943

Answers (2)

Robert Niestroj
Robert Niestroj

Reputation: 16151

This code works:

public class HomePage extends WebPage {

    private static final long serialVersionUID = 1L;

    private String someValue;
    private WebMarkupContainer container;

    public HomePage(final PageParameters parameters) {
        super(parameters);
        add(container = container());
        add(textfield());

    }

    private WebMarkupContainer container() {
        WebMarkupContainer wmc = new WebMarkupContainer("container") {

            @Override
            protected void onConfigure() {
                super.onConfigure(); 
                setVisible("SHOW".equals(someValue));
            }

        };
        wmc.setOutputMarkupPlaceholderTag(true);
        return wmc;
    }

    private TextField textfield() {
        TextField tf = new TextField("textfield", new PropertyModel(HomePage.this, "someValue"));
        tf.add(new OnChangeAjaxBehavior() {

            @Override
            protected void onUpdate(AjaxRequestTarget art) {
                //just model update
                art.add(container);
            }
        });
        return tf;
    }

}

Upvotes: 1

ljgw
ljgw

Reputation: 2771

Use

container.setOutputPlaceHolderTag(true);
container.setOuputMarkupId(true);

textfield.add(new OnChangeAjaxBehavior() {

            @Override
            protected void onUpdate(AjaxRequestTarget target) {
                form.modelChanged();

                if ("SHOW".equals(((TextField<String>) getComponent()).getModelObject())) { //change this
                    container.setVisible(true);
                } else {

                    container.setVisible(false);
                }
                target.addComponent(container);
}

I got this tip from Getting a Wicket text box's value in an AJAX onchange event

Upvotes: 0

Related Questions