我想创建一个新组件EditableLabel。
(有AjaxEditableLabel,但我不喜欢它的行为方式 - 从<span>
更改为<input>
并返回。)
我希望它能够支持AJAX - 至少是onchange。但是用户应该可以省略AJAX。理想情况下,他会决定(不)添加Behavior
。
我的实现是基于CSS的 - 它始终是一个输入,只是改变了它的外观。这是通过JavaScript完成的,也可以在没有AJAX的情况下使用。
到目前为止,我已经尝试了
使用AbstractAjaxBehavior
on requestCycle.scheduleRequestHandlerAfterCurrent(new TextRequestHandler("text/plain", "UTF-8", ret));
在onRequest()中,文本字段在适当的时候发送value
(输入按下,焦点丢失,......)
这里的问题是我无法使用AjaxRequestTarget。这种方法适用于简单的服务器 - 客户端通信,如自动完成。
只使用TextField
和AjaxFormComponentUpdatingBehavior("update")
。
问题是它与我的JavaScript事件处理程序冲突。
什么是正确的方法?我认为我应该在wicket中编写javascript事件处理程序的某种方式,因此他们不会根据服务器响应进行CSS更改(即不重新渲染服务器发送的内容),但Wicket会创建JS,以便事件不会发生冲突。
欢迎使用本主题的任何示例。
答案 0 :(得分:0)
如果问题是事件处理程序发生冲突,您可以在类中对它们进行建模,并根据用户的需要输出所需的内容。如果用户不想要AJAX,请使用SimpleAttributeModifier
来输出事件处理程序。
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;
}
}
}
});