【问题标题】:JSF 2/Primefaces p:ajax not updating panel after onchange event is firedJSF 2/Primefaces p:ajax 在 onchange 事件被触发后不更新面板
【发布时间】:2012-06-23 04:55:39
【问题描述】:

在过去的 2 天里,我真的被这个问题困扰着,并且很难理解 Primefaces 如何根据他们的 ID 更新客户端上的 UI 组件。

我有一个 h:selectOneMenu 计数要显示的面板数量。每个 p:panel 都将包含一个带有许多表单元素的 panelGrid。下拉菜单上的 onchange 事件被触发,我可以在托管 Bean 中看到计数。虽然我没有看到面板在客户端动态增加。我认为我的 p:ajax 参数有问题,但我不完全理解它是如何工作的。这是相关代码:

    <h:selectOneMenu id="numapps" value="#{mbean.appCount}">
                <f:selectItem itemLabel="1" itemValue="1" />
                <f:selectItem itemLabel="2" itemValue="2" />
                <f:selectItem itemLabel="3" itemValue="3" />
                <f:selectItem itemLabel="4" itemValue="4" />
                <f:selectItem itemLabel="5" itemValue="5" />
                <p:ajax update="appsContainer" event="change"   
                    listener="#{mbean.onChangeNumApps()}" />    
    </h:selectOneMenu>

    <p:panel id="appsContainer" >
           <p:panel header="Application" id="appsPane" value="#{mbean.submittedApps}" var="app" multiple="true">

submittedApps 是一个包含面板表单元素的列表。这是我的 mbean 监听器:

public void onChangeNumApps()
{
    List<Apps> c = new ArrayList<Apps>();
    logger.info("on change event fired");
    logger.info("new value is "+mbean.getAppCount());
    for (int i=0;i < mbean.getAppCount();i++)
    {
        c.add(new App());
    }
    mbean.setSubmittedApps(c);
}

我将 p:ajax 与 h:selectone 混合使用,因为由于某种原因我无法使 p:selectone 工作 - 可能是由于 CSS 与我的样式表发生冲突??

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

    从 JSF 树中添加/删除动态组件要简单得多。 虽然我主要研究 RF 和 JSF2.0,所以在 primefaces 的代码方面我无法为您提供太多帮助,但我可以列出可以根据从接收到的数字添加动态组件的步骤valuechange 监听器。

    在您的帖子中,您需要根据从

    提交的值具有动态数量的表单元素

    为此,您可以在 valuechanelistener 上获取所选面板数量的值。

    1. 您在 valuechangelistener 中创建了一个新面板。
    2. 根据从 valuechangelistener 收到的数字创建所需的表单元素。
    3. 将这些元素作为子元素添加到面板中。
    4. 将此面板作为子面板添加到之前页面上的面板中。

    您可以使用 JSF 内置的 uniqueID 函数,而不是手动为每个动态组件分配 ID,该函数将自动为您提供唯一 ID。 如果您需要进一步使用动态组件来提取值,则需要将 ID 存储在单独的集合中,然后根据 ID 获取动态组件的值。

    获取组件的唯一 ID:-

    FacesContext.getCurrentInstance().getViewRoot().createUniqueId();

    要动态添加组件到JSF树,请找到下面提到的代码sn-p:-

    HtmlPanelGrid panelGrid=new HtmlPanelGrid();
    panelGrid.setColumns(2);
    String uniqueId=FacesContext.getCurrentInstance().getViewRoot().createUniqueId();
    panelGrid.setId(uniqueId);    arrLstComponentIds.add(uniqueId);
    HtmlInputText inputText = new HtmlInputText();    
    HtmlOutputLabel outputLabel=new HtmlOutputLabel();
                                              panelGrid.getChildren().add(outputLabel);
    panelGrid.getChildren().add(inputText);
    htmlGridElement = new HtmlPanelGrid();      htmlGridElement.getChildren().add(panelGrid); 
    

    您需要重新渲染面板,以便反映 JSF 树中的更改。

    【讨论】:

      【解决方案2】:

      让它与 ui:repeat 一起工作,而不是在面板上迭代。

      【讨论】:

        猜你喜欢
        • 2012-05-06
        • 2014-07-08
        • 1970-01-01
        • 2011-05-22
        • 2014-03-29
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        相关资源
        最近更新 更多