从1.5.x升级到6.x时Wicket Decorator到Listener

时间:2014-04-25 12:59:28

标签: wicket-1.5 wicket-6

我被要求在网络应用中将wicket版本从1.5.9升级到6.14.0。 我发现将(行为)装饰器升级为听众非常有问题。

https://cwiki.apache.org/confluence/display/WICKET/Wicket+Ajax#WicketAjax-o.a.w.ajax.IAjaxCallDecoratorisreplacedwitho.a.w.ajax.attributes.IAjaxCallListener

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。 :)

1 个答案:

答案 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似乎很糟糕,因为它没有用“装饰脚本”来解释参数,因此我误解了这个问题......

http://wicket.apache.org/apidocs/1.5/org/apache/wicket/ajax/calldecorator/AjaxCallDecorator.html#decorateScript%28org.apache.wicket.Component,%20java.lang.CharSequence%29