java - 如何在 ajax 调用上更新 Wicket 口 AjaxEditableMultiLineLabel 模型

标签 java ajax textarea wicket wicket-6

我试过很多东西都没有成功。目前我的代码如下所示:

主页.html:

            <div wicket:id="text3" contenteditable="true">
            </div>

主页.java:

    public HomePage(final PageParameters parameters) {
//...

    AjaxEditableMultiLineLabel textArea = 
            new AjaxEditableMultiLineLabel ("text3", new PropertyModel (this, "text3") );


    textArea.add(new AjaxEventBehavior ("keyup") {

        @Override
        protected void onEvent(AjaxRequestTarget target) {
            System.out.println( "on event!" );
            System.out.println( getText3 () );
        }
    });
//...
}

/**
 * @return gets text3
 */
public String getText3() {
    return text3;
}

/**
 * @param text3
 *            the text3 to set
 */
public void setText3(String text3) {
    this.text3 = text3;
}

我想获取“div”中的内容,但它没有在 ajax 调用中更新。我可以强制它以某种方式发送吗?

顺便说一下,我想要实现的是每次更新时都获取富文本区域的纯文本内容,以防在 wicket 中有更简单的方法。

最佳答案

您将 AjaxEventBehavior 添加到不正确的 AjaxEditableMultiLineLabel。 AjaxEditableMultiLineLabel 是一个包含两个组件的面板:

  • 标签
  • 编辑器(文本区域)

任何 Ajax 行为都必须添加到任何这些组件中。在您的情况下,您必须向编辑器添加一个行为。

(以下完整工作示例在 https://repo.twinstone.org/projects/WISTF/repos/wicket-examples-6.x/browse 上)

标记

    <h2>Form</h2>
    <form wicket:id="form">
        <div wicket:id="text"></div>
        <input wicket:id="submit" type="submit" value="Send" />
    </form>

    <hr/>

    <h2>Result</h2>
    <div wicket:id="result">[result placeholder]</div>

代码片段

    final IModel<String> textModel = Model.of("initial text");

    Form<String> form = new Form<>("form", textModel);
    add(form);

    AjaxEditableMultiLineLabel<String> textArea = new AjaxEditableMultiLineLabel<String>(
            "text", textModel) {

        private static final long serialVersionUID = 1L;

        @Override
        protected FormComponent<String> newEditor(MarkupContainer parent,
                String componentId, IModel<String> model) {
            final FormComponent<String> editor = super.newEditor(parent,
                    componentId, model);

            editor.add(new AjaxFormComponentUpdatingBehavior("keyup") {

                private static final long serialVersionUID = 1L;

                @Override
                protected void onUpdate(AjaxRequestTarget target) {
                    System.out.println("Ajax update for textArea " + editor.getDefaultModelObjectAsString());

                }
            });

            return editor;
        }

    };

    textArea.setCols(50);
    textArea.setRows(20);

    form.add(textArea);
    form.add(new SubmitLink("submit"));

    add(new Label("result", textModel));

警告:之前的代码真的很慢

代码非常慢,因为每次按键/释放都会导致以下情况:

  1. 用textarea的内容调用服务器
  2. 在服务器端调用代码(更新、渲染等)
  3. 在 XML 响应 (AJAX) 中将整个结果标记作为 html 发回
  4. 替换整个结果标签

它在本地主机上很慢,在真实的互联网上肯定不能用。

解决方案

使用简单的 jQuery 更新(JavaScript,jQuery 内置于 Wicket 6 中)

jQuery更新的代码片段

    final IModel<String> textModel = Model.of("initial text");
    final Label result = new Label("result", textModel);
    result.setOutputMarkupId(true);
    add(result);

    Form<String> form = new Form<>("form", textModel);
    add(form);

    AjaxEditableMultiLineLabel<String> textArea = new AjaxEditableMultiLineLabel<String>(
            "text", textModel) {

        private static final long serialVersionUID = 1L;

        private boolean initialized = false;

        private FormComponent<String> editor;

        @Override
        public void onEdit(AjaxRequestTarget target) {
            super.onEdit(target);
            if(!initialized) {
                String editorId = editor.getMarkupId();
                String resultId = result.getMarkupId();
                StringWriter sw = new StringWriter();
                sw.write("$('#");
                sw.write(editorId);
                sw.write("').keyup(function() { var str = $('#");
                sw.write(editorId);
                sw.write("').val(); ");
                sw.write("$('#");
                sw.write(resultId);
                sw.write("').html(str); });");
                String js = sw.toString();
                System.out.println("Appending editor JS " + js);
                target.appendJavaScript(js);
                initialized = true;
            }
        }

        @Override
        protected FormComponent<String> newEditor(MarkupContainer parent,
                String componentId, IModel<String> model) {
            editor = super.newEditor(parent, componentId, model);
            return editor;
        }

    };

    textArea.setCols(50);
    textArea.setRows(20);

    form.add(textArea);
    form.add(new SubmitLink("submit"));

关于java - 如何在 ajax 调用上更新 Wicket 口 AjaxEditableMultiLineLabel 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526077/

相关文章:

java - 在 C++ 中,cin 和 cout 对象与其类 iostream 的关系如何?

java - jSoup.connect(url).get() 给出错误异常 Android 应用程序

java - 在 Applet 中加载 ActiveX 对象

javascript - 在 beforeunload/unload 上发送 Ajax 调用

jquery - 当ajax响应为空时显示一条消息

php - 如何使用 php 清理特定标签的 textarea 输入

java - 如何使用 gradle 在 java 项目中添加 native 依赖项

javascript - ajax给出html和脚本

css - firefox : text breaks off after adding a white space 中奇怪的文本区域行为

javascript - 如何使用textarea插入html和javascript代码