0

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

https://cwiki.apache.org/confluence/display/WICKET/Wicket+Ajax#WicketAjax-oawajax.IAjaxCallDecoratorisreplacedwitho.awajax.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 了,而最新版本的菜鸟尤其如此。:)

4

1 回答 1

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));

所以“脚本”是由检票口生成的,实际上没有内容可以由(UI)开发人员设置,并且可能需要在 java 端进行修改。

一般来说,当给定要修改的生成脚本并在升级到 6.14.0 时完全忽略此选项时,我认为这种行为不好(如在 1.5.9 中)似乎是合理的......即使这会导致白发和额外的工作来修复功能随着升级而损坏。

上面给出的代码示例是正确的,您只需要弄清楚在 GenericListenerImpl 中添加(覆盖)什么行为,以获得与使用 SmallDecorator 装饰脚本相同的功能。

AjaxCallDecorator 的 API 似乎很糟糕,因为它没有用“decorateScript”解释参数,因此我被这个问题误导了......

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

于 2014-04-28T08:06:29.843 回答