我被要求在网络应用中将wicket版本从1.5.9升级到6.14.0。 我发现将(行为)装饰器升级为听众非常有问题。
o.a.w.ajax.IAjaxCallDecorator is replaced with o.a.w.ajax.attributes.IAjaxCallListener.
我成功创建了一个POC,几乎可以正确地升级所需的部件。
在1.5.9中,元素脚本可以像这样进行装饰(在低级别,还涉及其他更改,但结束于此)
public class MyBehavior extends AjaxFormComponentUpdatingBehavior {
@Override
// (removed in upgrade to 6.14.0)
protected IAjaxCallDecorator getAjaxCallDecorator() {
return new SmallDecorator();
}
private class SmallDecorator extends AjaxCallDecorator {
public SmallDecorator() {}
@Override
public CharSequence decorateScript(Component component, CharSequence script) {
return "alert('decorated onblur');" + script;
}
}
}
在6.14.0中,这样做是完全相同的(据我所知,这是正确的)
public class OnBlurBehavior extends AjaxFormComponentUpdatingBehavior {
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
attributes.getAjaxCallListeners().add(new
GenericListenerImpl("alert('Listener onblur')"));
}
private class GenericListenerImpl extends AjaxCallListener {
private String decoratorScript = null;
public GenericListenerImpl(String decoratorScript) {
this.decoratorScript = decoratorScript;
}
@Override
public CharSequence getPrecondition(Component component) {
return this.decoratorScript;
}
}
}
现在这可以在基本的,但是当我想编辑或包装"脚本"就像在1.5.9版本中完成一样,我怎样才能在6.14.0版本中完成它?
这对我来说已经证明是非常有问题的,因为我没有使用Wicket一段时间(并且很长一段时间)并且特别是最新版本的noob。 :)
答案 0 :(得分:0)
我的印象是"脚本" 1.5.9中的部分包含UI开发人员为html中的元素添加的单个元素属性字符串(或类似的东西)。但仔细检查后会发现"脚本"内容实际上看起来像这样:
var wcall=wicketAjaxPost('./?0-1.IBehaviorListener.0-input', wicketSerialize(Wicket.$('input')),function() { }.bind(this),function() { }.bind(this), function() {return Wicket.$('input') != null;}.bind(this));
所以"脚本"是wicket生成的东西,实际上没有(UI)开发人员设置的内容,可能需要在java端进行修改。
一般情况下,我认为这样的行为不好(如在1.5.9中),当给定生成的脚本进行修改并在升级到6.14.0时省略此选项似乎是合理的...即使这会导致白发和额外的工作修复因升级而破坏的功能。
上面给出的代码示例是正确的,您只需要确定在GenericListenerImpl中添加(覆盖)的行为,以获得与使用SmallDecorator修饰脚本相同的功能。
AjaxCallDecorator的API似乎很糟糕,因为它没有用“装饰脚本”来解释参数,因此我误解了这个问题......