2014-04-25 2 views
0

web-app에서 wicket 버전을 1.5.9에서 6.14.0으로 업그레이드해야합니다. (동작) 데코레이터를 청취자에게 매우 문제가있는 것으로 업그레이드하는 것을 발견했습니다. 1.5.x에서 6.x로 업그레이드 할 때 리스너와 Wicket Decorator

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에서

(낮은 수준은 다른 변경 관련이 있지만, 이것에 종료)처럼 수행 6.14.0 같은에서

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

을 이 (지금까지의 내가 제대로 이해로)

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을 사용하지 않았고, 멍청한 놈이 특별히 최신 버전에 오는 것과 같이 매우 문제가있는 것으로 판명되었습니다. :)

답변

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 개발자) 자바 측에서 수정이 필요할 수 있습니다.

일반적으로 나는 (1.5.9에서와 같이) 수정 된 생성 된 스크립트가 주어 졌을 때 6.14.0으로 업그레이드 할 때이 옵션을 모두 생략하는 것이 좋다고 생각한다. 심지어 이것은 회색 머리카락과 여분의 업그레이드로 인해 기능이 손상되는 것을 수정하는 작업.

위의 코드 예제는 정확합니다. SmallDecorator로 스크립트를 꾸미는 것과 동일한 기능을 얻기 위해 GenericListenerImpl에 추가 (재정의) 할 동작을 알아야합니다.

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

관련 문제