如何在@PostConstruct方法中访问组件的子节点?

时间:2011-12-28 18:39:04

标签: jsf jsf-2 primefaces

我想处理支持bean中<p:panel>内的所有<h:panelGroup>组件。我已将<h:panelGroup>绑定到支持bean属性。但在@PostConstruct方法中,属性为null。在属性setPanel()的setter期间,组件没有子项。如果我使用按钮提交某些内容,那么我可以获得该小组的孩子。

@PostConstruct方法中,我需要做些什么来获取组件的子项?

查看:

<h:panelGroup binding="#{wiz.panel}">
    <p:panel header="one">
        <h:outputText value="primeiro" />
    </p:panel>

    <p:panel header="two">
        <h:outputText value="segundo" />
        <h:inputText />
    </p:panel>

    <p:panel header="three">
        <h:outputText value="terceiro" />
    </p:panel>

    <p:panel header="four">
        <h:outputText value="quarto" />
    </p:panel>
</h:panelGroup>

支持bean

@PostConstruct
public void init() {
    if (getPanel() != null) {
        for (UIComponent comp : getPanel().getChildren()) {
            if (comp instanceof Panel) {
                System.out.println(((Panel) comp).getHeader());
            }
            System.out.println("not a panel child");
        }
    } else {
        System.out.println("panel is null");
    }
}

1 个答案:

答案 0 :(得分:0)

这是不可能的。在组件树完成构建之前很久就可以调用@PostConstruct。而是挂钩preRenderView事件。在那时,视图保证已经建立。您可以在视图中按<f:event>附加事件侦听器方法,如下所示:

<f:event type="preRenderView" listener="#{bean.init}" />

不要忘记从@PostConstruct方法中删除init()注释,或者在必要时重命名/拆分方法。

毋庸置疑,这种做法很可疑。我建议重新考虑您的方法,如有必要,请提出一个新问题,其中详细说明功能要求。也许最终的答案就是使用普通的EL和/或rendered属性。