2

我想创建一个新组件 EditableLabel。(有 AjaxEditableLabel,但我不喜欢它的行为方式 - 来回切换<span><input>

我希望它支持 AJAX - 至少 onchange。但是用户应该能够忽略 AJAX。理想情况下,他会通过(不)添加一个Behavior.

我的实现是基于 CSS 的——它一直是一个输入,只是改变它的外观。这是通过 JavaScript 完成的,使其也可以在没有 AJAX 的情况下使用。

到目前为止,我已经尝试过

  • 在 onRequest() 中使用AbstractAjaxBehaviorwith requestCycle.scheduleRequestHandlerAfterCurrent(new TextRequestHandler("text/plain", "UTF-8", ret));,文本字段会value在适当的时候发送它(输入按下,焦点丢失,...)

    这里的问题是我不能使用 AjaxRequestTarget。这种方法更适用于简单的服务器-客户端通信,例如自动完成。

  • 简单地使用TextFieldwith AjaxFormComponentUpdatingBehavior("update")

    问题是它与我的 JavaScript 事件处理程序发生冲突。

什么是正确的方法?我假设有某种方法我应该在 wicket 中编写 javascript 事件处理程序,因此它们不会根据服务器响应进行 CSS 更改(即不重新渲染服务器发送的内容),但 Wicket 会生成 JS,以便事件不会发生冲突。

欢迎任何有关此主题的示例。

4

1 回答 1

0

如果问题是事件处理程序发生冲突,您可以在类中对它们进行建模,并根据用户的需要输出所需的内容。如果用户不想要 AJAX,请使用 aSimpleAttributeModifier仅输出事件处理程序。

TextField t = new TextField("id");
t.add(new SimpleAttributeModifier("onchange", "alert('hi!')"));

AttributeModifier如果事件处理程序可以根据某些条件是动态的,您也可以使用更强大的。考虑到 CSS 类也可以通过AttributeModifier或来操作AttributeAppender

如果用户确实想要 AJAX,只需添加行为。如果您想将自定义 javascript 添加到 ajax 事件处理程序,您可以重写AbstractDefaultAjaxBehavior#getAjaxCallDecorator()以返回一个IAjaxCallDecorator或任何其便利子类,以将您的自定义 javascript 添加/附加到 ajax 调用。您甚至可以在调用以成功或失败结束时添加自定义 JS。

TextField t = new TextField("id");
t.add(new AjaxEventBehavior("update") { 
    @Override
    protected void onEvent(AjaxRequestTarget target) {
        // ...
    }
    @Override
    protected IAjaxCallDecorator getAjaxCallDecorator() {
        return new AjaxCallDecorator(){
            @Override
            public CharSequence decorateScript(CharSequence script) { 
                return "alert('hi!')" + script; 
            }
        }
     }
});
于 2013-01-11T10:21:12.693 回答