【问题标题】:Wicket: How to change label's text on textarea's onkeyup?Wicket:如何更改 textarea onkeyup 上的标签文本?
【发布时间】:2010-01-22 12:46:42
【问题描述】:

如何在 textarea 的 onkeyup 上更改标签的文本?我已经尝试过了,但不起作用:

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() 的直觉不好 - 由于某种原因,标签保持不变。

顺便说一下,结果很快就会作为JTexy lightweight markup language沙盒服务。

感谢您的帮助!

【问题讨论】:

    标签: java ajax model wicket


    【解决方案1】:

    如果你想在 AJAX 事件之后更新组件,你必须做两件事:

    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 我不明白你的代码的很多部分。

    【讨论】:

    • > 我不明白你的代码的很多部分。 -- 我两个都不做 :) 我是 Wicket 的新手,它并不完全直观。
    • 非常棒的检票口功能是将字段绑定到组件。因此,您不需要“公共类 MyLabel 扩展标签”。要求全部创建 PropertyModel: MyPage .. { String text = "original"; .... 在构造函数中 .... new Label("id",new PropertyModel(this,"text"); } 在此检票口绑定标签和文本字段之后。因此,当您处理提交或 AJAX 事件时,您不会需要像这样写: text = label.getValue() System.out.println(text); wicket 到这个自动,只需写: sysout(text);
    • 你可能对这篇文章感兴趣:cwiki.apache.org/WICKET/working-with-wicket-models.html
    • 最后一个问题——处理事件时如何获取textarea的内容?它的模型没有更新(仍然包含我初始化的内容)。
    • 试试这个链接:wicket.apache.org/exampleguestbook.html我认为你可以将内容TextArea绑定到其他字段,并在ajax行为中labelText = contentText。更感兴趣的尝试将 labelText 也绑定到 TextArea,甚至将 Label.getValue 绑定到 TextArea。
    【解决方案2】:

    而不是 resultDiv.renderComponent(); 试试 resultDiv.modelChanged();

    【讨论】:

    • 没用;恕我直言modelChanged() 是一个要被覆盖的回调(只是从名称中猜测)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2011-03-15
    相关资源
    最近更新 更多