Калитка: изменение текста AjaxButton при отправке

Я новичок в Wicket и пытаюсь изменить текст AjaxButton при отправке. Итак, идея состоит в том, что при первой загрузке страницы пользователь видит AjaxButton, помеченный, например. «1», после нажатия кнопки метка кнопки меняется на «2», а после следующего нажатия на «3» и так далее... Это несложно, но, как я уже сказал, я нуби, когда дело доходит до калитки. Вся помощь приветствуется!

form.add(new AjaxButton("ajax-button", form)
    {
        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form)
        { //how to change Button label here?
         }

}


person user594883    schedule 22.03.2011    source источник


Ответы (2)


Ответ прост: используйте модель.

        //counter field declared in page class
        private int counter;

            ...

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

        @Override
        protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
            counter++;
            target.addComponent(this);

        }
    });

Это, пожалуй, самое важное правило Wicket: когда вам нужно что-то изменить, используйте модель. К этому нужно некоторое время, чтобы привыкнуть, особенно если у вас есть опыт работы с более «традиционными» фреймворками и вы не использовали Swing.

Nb: сохранение счетчика в классе страниц может быть плохой идеей, но общая идея та же.

person biziclop    schedule 22.03.2011
comment
Я потратил некоторое время, пытаясь заставить это работать для независимой кнопки (<input type="button"> & AjaxButton или AjaxLink), которая не была частью какой-либо формы. Любопытно, что это сработало только после того, как я добавил (фиктивную) форму в HTML и Java вокруг кнопки. На всякий случай, если кто-то еще задается вопросом об этом. Калитка 1.4. - person Jonik; 22.03.2012
comment
Нет ли в этом примере неправильно расставленных скобок? Форма должна быть отправлена ​​в качестве параметра AjaxButton, а не PropertyModel. - person Johncl; 13.09.2013

В дополнение к ответу бициклопа, вот решение для текста с изменяющимся параметром.

В вашем Java-коде:

AjaxButton yourButton = new AjaxButton("btnId"){
//your button's implementation goes here
};
int yourVariable = 42;
Label yourLabel = new Label("labelId", new Model<String>() {
        public String getObject() {
            String text = MessageFormat.format(new Localizer().getString("IdForLocalizerInYourLocalizerFile", null), yourVariable);
            return text;
        }
    })
yourButton.add(yourLabel);

В вашем html:

  <a type="submit" wicket:id="btnId">
    <span wicket:id="labelId">[This text will never be seen, will be replaced by "The var..."]</span>
  </a>

Наконец, ваш файл локализации будет содержать строку вроде:

IdForLocalizerInYourLocalizerFile= The variable's value is {0}. It will be replaced whenever it changes and button component is added to target. Text will remain.
person BlondCode    schedule 23.12.2016