2014-04-25 193 views
0

我已經被要求在Web應用程序中將Wicket版本從1.5.9升級到6.14.0。 我發現升級(行爲)裝飾器聽衆很有問題。將Wicket Decorator升級爲Listener從1.5.x升級到6.x

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的種類特別是最新版本。 :)

回答

0

我的印象是,1.5.9中的「腳本」部分包含UI開發人員爲html中的元素添加的單個String元素屬性(或類似的東西)。但檢查中詳細揭示了「腳本」的內容實際上看起來是這樣的:

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端進行修改。

一般來說,當給定生成的腳本進行修改時,我認爲這種行爲很糟糕(如1.5.9),並且在升級到6.14.0時忽略此選項似乎是合理的...即使這會導致灰白的頭髮和額外的努力解決隨升級而中斷的功能。

上面給出的代碼示例是正確的,您只需要弄清楚在GenericListenerImpl中添加(覆蓋)哪些行爲以獲得與使用SmallDecorator裝飾腳本相同的功能。

爲AjaxCallDecorator的API似乎是不好的,因爲它不符合「decorateScript」 explaing的參數,所以我用這個問題誤導...

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