2011-05-27 70 views
4

我有一個類CloakDecorator它實現IAjaxCallDecoratorIHeaderContributor:現在renderHead不叫

public class CloakDecorator implements IAjaxCallDecorator, IHeaderContributor { 

    @SuppressWarnings("unused") 
    private static final ResourceReference INDICATOR = new ResourceReference(CloakDecorator.class, "indicator.gif"); 
    private static final ResourceReference JS = new JavascriptResourceReference(CloakDecorator.class, "CloakDecorator.js"); 
    private static final ResourceReference CSS = new ResourceReference(CloakDecorator.class, "CloakDecorator.css"); 

    public CloakDecorator() { 
     System.out.println("Constructor"); 
    } 

    public void renderHead(final IHeaderResponse response) { 
     System.out.println("renderHead"); 
     response.renderCSSReference(CSS); 
     response.renderJavascriptReference(JS); 
    } 

    @Override 
    public CharSequence decorateScript(CharSequence script) { 
     return script; 
    } 

    @Override 
    public CharSequence decorateOnSuccessScript(CharSequence script) { 
     return script; 
    } 

    @Override 
    public CharSequence decorateOnFailureScript(CharSequence script) { 
     return script; 
    } 
} 

從AjaxLink我實例CloakDecorator

AjaxLink link=new AjaxLink("") { 

    @Override 
    public void onClick(AjaxRequestTarget target) { 

    } 

    @Override 
    protected IAjaxCallDecorator getAjaxCallDecorator() { 
     return new CloakDecorator(); 
    } 
}; 

的問題是,CloakDecorator構造是稱爲但renderHead方法不被調用。我做錯了什麼?我已經在構造函數和renderHead方法中放置了一些System.out.println,構造函數的System.out.println正在工作,但第二個沒有。

回答

2

不幸的是,簡單地實施IHeaderContributor並不能保證您實際上會對頁面/組件的頁眉作出貢獻。這僅適用於添加到頁面和頁面本身的ComponentIBehavior元素的實例。具體地從IHeaderContributor的Javadoc:

An interface to be implemented by components or behaviors that wish to 
contribute to the header section of the page. 

調用這是Component#renderHead(HtmlHeaderContainer)的特定代碼。它檢查本身及其任何行爲是否實施IHeaderContributor,然後添加這些貢獻。

解決您的問題,您可以:

  1. 有你AjaxLink實施IHeaderContributor
  2. 添加IBehaviorAjaxLink實現IHeaderContributor

根據多久你將使用此,選項#1可能是最好的。創建一個「CloakedAjaxLink」來完成你所需要的一切。

0

我認爲你需要添加一個IHeaderContributor到一個組件,使它實際上對文檔「貢獻」。你使用它的方式只使用了你想要的一半實現。我建議你分割你的實現或者編寫一個CloakLink,包括這個代碼,這個代碼將能夠爲它添加的頁面做出貢獻。

1

由於Wicket 1.5 IAjaxCallDecorators如果他們實現IComponentAwareHeaderContributor,也可以爲頭部做出貢獻。

+0

我正在使用wicket 1.3.6,是否有可能在那裏? – 2011-05-28 07:07:52

+0

您應該認真考慮升級到至少Wicket 1.4 - 有一些遷移開銷,但這是一個重大改進。無論哪種情況,我都不認爲你會得到這個能力,因爲它是在Wicket 1.5中:) – jbrookover 2011-05-28 12:54:31