通过selectOneMenu从JSF2 / Facelets子视图中更新文本组件

时间:2012-04-24 10:05:38

标签: ajax jsf-2 facelets selectonemenu

我有一个名为basedata-cpanel.xhtml的Facelets 子视图,它通过<ui:param>传递其参数:

<ui:define name="content-top">
  <h:form>
    <ui:include src="/subviews/basedata-cpanel.xhtml">
      <ui:param name="customerId"   value="#{pqHome.pq.customer.id}" />
      <ui:param name="customerName" value="#{pqHome.pq.customer.name}" />
      <ui:param name="customers"    value="#{organizationManager.allCustomers}" />        
    <ui:include />
  </h:form>
</ui:define>

在子视图中,我只想在下面的面板中显示当前选定的客户名称(该面板用于NEW和UPDATE面板/页面)。我需要一个AJAX请求。

/subviews/basedata-cpanel.xhtml中的代码:

      <h:selectOneMenu value="#{customerId}" id="customer-select">
        <f:selectItems value="#{customers}"
                       var="customer"
                       itemValue="#{customer.id}"
                       itemLabel="#{customer.name}" />
        <f:ajax render="customer-name" />
      </h:selectOneMenu>
      <h:outputText value="#{customerName}" id="customer-name" />

我将<f:ajax render="customer-name" />放入select中,但不更新outputText。我真的没想到,但是......

我需要做些什么才能让它发挥作用?

由于Facelets子视图仍然具有与传递的参数相同的参数,我如何获得“新的”?对此最好的做法是什么?

PS:pqHome是@ViewScoped bean

1 个答案:

答案 0 :(得分:1)

您的下拉列表仅更改客户的ID,而不是客户名称。更重要的是,它根本不会改变整个客户实体。它只会更改现有客户的ID。这不好。

您需要更改代码,让它设置整个客户,而不是仅设置其ID。 E.g。

<ui:include src="/subviews/basedata-cpanel.xhtml">
    <ui:param name="customer" value="#{pqHome.pq.customer}" />
    <ui:param name="customers" value="#{organizationManager.allCustomers}" />        
</ui:include>

<h:selectOneMenu value="#{customer}" id="customer-select" converter="customerConverter">
    <f:selectItems value="#{customers}" var="c" itemValue="#{c}" itemLabel="#{c.name}" />
    <f:ajax render="customer-name" />
</h:selectOneMenu>
<h:outputText value="#{customer.name}" id="customer-name" />

不要忘记创建一个Converter,用于在客户ID和Customer对象之间进行转换,并在<h:selectOneMenu>中使用它。