2010-01-22 3 views
4

Как изменить текст ярлыка на onkeyup textarea? Я пробовал это, но не работает:Wicket: Как изменить текст ярлыка на onkeyup textarea?

Form form; 
TextArea ta; 
MyLabel resultDiv; 


    /** 
    * Constructor that is invoked when page is invoked without a session. 
    */ 
    public HomePage(final PageParameters parameters) { 

     this.form = new Form("form"); 
     this.ta = new TextArea("text"); 
     this.resultDiv = new MyLabel("result"); 

     this.ta.add(new AjaxEventBehavior("onKeyUp") { 
     protected void onEvent(AjaxRequestTarget target) { 
      System.out.println("Ajax!"); 
      resultDiv.setText("Foobar"); 
      resultDiv.renderComponent(); 
     } 
     }); 


     form.add(ta); 
     form.add(resultDiv); 
     add(form); 

    }// const 

    public class MyLabel extends Label { 
    private String text = "original"; 
    public String getText() {  return text; } 
    public void setText(String text) {  this.text = text; } 
    public MyLabel(String id) { 
     super(id); 
     this.setModel(new PropertyModel(this,"text")); 
    } 
    } 

Решение

leonidv был почти там. Результирующий код:

Form form; 
TextArea ta; 
Label resultDiv = new Label("result", new PropertyModel(this,"labelText")){ 
    { setOutputMarkupId(true); } 
}; 

private String labelText = "original"; 


/** 
* Constructor that is invoked when page is invoked without a session. 
*/ 
public HomePage(final PageParameters parameters) { 

    this.form = new Form("form"); 

    this.ta = new TextArea("text"); 
    this.ta.add(new AjaxEventBehavior("onKeyUp") { 
     protected void onEvent(AjaxRequestTarget target) { 
     System.out.println("Ajax!"); 
     labelText = "Foobar"; // Doesn't even need get/set, which is great. 
     target.addComponent(resultDiv); 
     //resultDiv.renderComponent(); // WRONG!! 
     } 
    }); 

    form.add(ta); 
    form.add(resultDiv); 
    add(form); 

}// const 

последняя проблема была моя плохая интуиция о добавлении renderComponent() - что, по какой-то причине, сохранил этикетку без изменений.

К слову, результат будет служить в скором времени как песочница.

Спасибо за помощь!

ответ

4

Если вы хотите обновить компоненты после AJAX события, вы должны сделать 2 вещи:

  1. Обновляемые компоненты должны быть выставиться флаг setOutputMarkupId == true;
  2. Вы должны добавить эти компоненты целевой OnEvent метод

    this.resultDiv.setMarkupOutputId(true); 
    
    protected void onEvent(AjaxRequestTarget target) { 
         System.out.println("Ajax!"); 
         //resultDiv.setModel(); 
         resultDiv.setText("Foobar"); 
         resultDiv.renderComponent(); 
         target.add(resultDiv); 
    } 
    

PS Я не понимаю многих частей вашего кода.

+0

> Я не понимаю многих частей вашего кода. - Я тоже не знаю :) Я новичок в Wicket, и это не совсем интуитивно. –

+1

Очень замечательная функция калитки - это обязательные поля для компонентов. Таким образом, вам не нужно «публичный класс MyLabel расширяет ярлык». Все запрашивается для создания PropertyModel: MyPage .. { Строка text = "original"; .... в конструкторе .... новый ярлык ("id", новый PropertyModel (это, "текст"); } После этого калитка связывает ярлык и текстовое поле. Итак, когда вы обрабатываете submit или AJAX событие вам не нужно писать л, как: текст = label.getValue() System.out.println (текст); калитка на это автоматически, просто написать: SYSOUT (текст); – leonidv

+0

вы можете быть заинтересованные в этой статье: http://cwiki.apache.org/WICKET/working-with-wicket-models.html – leonidv

0

вместо результатаDiv.renderComponent(); try resultDiv.modelChanged();

+0

Не работает; IMHO 'modelChanged()' является обратным вызовом для переопределения (просто угадывание от имени). –

Смежные вопросы