【问题标题】:How to access component's children during a @PostConstruct method?如何在 @PostConstruct 方法期间访问组件的子级?
【发布时间】:2011-12-28 18:39:03
【问题描述】:

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

@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>

支持豆

@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");
    }
}

【问题讨论】:

    标签: jsf jsf-2 primefaces


    【解决方案1】:

    这是不可能的。 @PostConstruct 可以在组件树完成构建之前很长时间被调用。而是挂钩preRenderView 事件。那时,可以保证视图已经构建。可以通过&lt;f:event&gt;在视图中附加一个事件监听方法,如下:

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

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

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

    【讨论】:

    • f:event 现在正在调用 init 方法,但 getPanel() 还没有子级。我应该尝试另一种“类型”吗?
    • getPanel() 方法只返回panel,对吗? (顺便说一句,为什么不直接访问panel?)。您使用的是什么 JSF impl/version?它适用于 Mojarra 2.1.4。
    猜你喜欢
    • 2019-06-07
    • 2020-08-03
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多