2011-05-31 118 views
1

我有两个selectOneMenu。我需要以下内容:如何使两个JSF selectOneMenus相互依赖AJAX?

  1. 在第一菜单变化我需​​要填充第二个和某种形式与AJAX
  2. 领域在第二个菜单的改变,我需要填充只有某种形式的领域机智AJAX。

填充第二个菜单和形式对第1步是完美的,第一菜单变化后立即领域,但与上一步填充形式的问题,当我第二次更改菜单的值2 什么也没有发生。但是,当我将第二个菜单值返回给NoSelectionOption ajax侦听器时调用。看来,AJAX监听器忽略了随AJAX添加的值。

这里是我的代码片段:

JSF:

<h:panelGrid> 
    <h:panelGrid columns="1"> 
     <h:panelGrid columns="1"> 
      <h:panelGrid columns="2"> 
       <h:outputText value="Получатель:" /> 
       <h:selectOneMenu value="#{paymentOrder.curContractor}"> 
        <f:selectItem itemLabel="Выберите контрагента .." noSelectionOption="true" /> 
        <f:selectItems value="#{paymentOrder.userContractors}" var="contr" 
         itemValue="#{contr.idcontractor}" 
         itemLabel="#{contr.pnamecontractor}"/> 
        <a4j:ajax event="valueChange" listener="#{paymentOrder.valueContractorChanged}" render="idINNContractor, idKPPContractor, idNameContractor, idContractorAccounts" execute="@this"/> 
       </h:selectOneMenu> 
      </h:panelGrid> 
      <h:panelGrid columns="1"> 
       <h:panelGrid columns="4"> 
        <h:outputText value="ИНН"/> 
        <h:inputText id="idINNContractor" value="#{paymentOrder.chosenContractor.inncontractor}"/> 
        <h:outputText value="КПП"/> 
        <h:inputText id="idKPPContractor" value="#{paymentOrder.chosenContractor.kppcontractor}"/> 
       </h:panelGrid> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Получатель"/> 
        <h:inputTextarea id="idNameContractor" value="#{paymentOrder.chosenContractor.pnamecontractor}"/> 
       </h:panelGrid> 
      </h:panelGrid> 
      <h:panelGrid columns="1"> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Счёт получателя:"/> 
        <h:selectOneMenu id="idContractorAccounts" value="#{paymentOrder.curContractorAccount}"> 
         <f:selectItem itemLabel="Выберите счёт .." noSelectionOption="true" /> 
         <f:selectItems value="#{paymentOrder.contractorAccounts}" var="acc" 
          itemValue="#{acc.naccountcontractor}" 
          itemLabel="#{acc.advName}"/> 
         <a4j:ajax event="valueChange" listener="#{paymentOrder.valueAccountChanged}" render="idContrAcc, idNameContrBank, idBikContrBank, idAccContrBank" execute="@this"/> 
        </h:selectOneMenu> 
       </h:panelGrid> 
       <h:panelGrid columns="2"> 
        <h:outputText value="Сч.№"/> 
        <h:inputText id="idContrAcc" value="#{paymentOrder.curContractorAccount}"/> 
       </h:panelGrid> 
      </h:panelGrid> 
     </h:panelGrid>  
</h:panelGrid> 
<h:panelGrid columns="1"> 
     <h:panelGrid columns="4"> 
      <h:panelGrid columns="2"> 
       <h:outputText value="Банк получателя"/> 
       <h:inputTextarea id="idNameContrBank" value="#{paymentOrder.chosenBank.namebank}" /> 
      </h:panelGrid> 
      <h:panelGrid columns="2"> 
       <h:outputText value="БИК"/> 
       <h:inputText id="idBikContrBank" value="#{paymentOrder.chosenBank.bikbank}"/> 
       <h:outputText value="Сч.№"/> 
       <h:inputText id="idAccContrBank" value="#{paymentOrder.chosenBank.bankkorshet}"/> 
      </h:panelGrid> 
     </h:panelGrid> 
    </h:panelGrid> 
</h:panelGrid> 

而且我的背豆片段:

public class PaymentOrder { 

    @EJB(lookup="JpaBankBean/local") 
    private JpaBankBeanLocal jpaBean; 
    private Paymentdocument pDocument; 
    private Paymentorder pOrder; 
    private Klbankrf chosenBank; 

    private String curContractorAccount; 
    private String curContractorBank; 
    private String curContractor; 
    private String err; 
    private String chosenAccount; 

    private Contractor chosenContractor; 
    @SuppressWarnings("rawtypes") 
    private Set contractorAccounts; 

    @SuppressWarnings("rawtypes") 
    private List contractorBanks; 
    private String userName; 
    private Date nowDate; 
    public PaymentOrder() { 
     this.nowDate = Calendar.getInstance().getTime(); 
     Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 
     if (principal instanceof UserDetails) { 
       setUserName(((UserDetails)principal).getUsername()); 
      } else { 
       setUserName(principal.toString()); 
      } 
     pDocument = new Paymentdocument(); 
     pOrder = new Paymentorder(); 
     chosenContractor = new Contractor(); 
     chosenBank = new Klbankrf(); 
    } 
    public void valueContractorChanged() 
    { 
     chosenContractor = jpaBean.getContractor(Integer.valueOf(getCurContractor())); 
     setContractorAccounts(jpaBean.getContractorAccounts(Integer.valueOf(getCurContractor()))); 
     pDocument.setReceiver(chosenContractor.getPnamecontractor()); 
    } 
    public List getUserContractors() 
    { 
     return jpaBean.getUserContractors(userName); 
    } 
    public void valueAccountChanged() 
    { 
     chosenBank.setNamebank("SBER"); 

     //TODO chosenBank = jpaBean.getContractorBank(getCurContractorAccount()); 
     //TODO setChosenAccount(""); 
    } 
} 

所以, “SBER” 出现在idNameContrBank场只有当我改变二级菜单值改为somethig,然后再改回NoSelectOption。这对我来说很奇怪。 我使用RichFaces 4,JBoss AS 6.

我在forum找到了一些信息,但是没有解决方案。 如何使第二个菜单改变一些东西?还是有我的错误?有任何想法吗?

在此先感谢!

我做了一些实验。 当我改变第二菜单填充了AJAX一定的价值,页面响应得到这样的:

<?xml version='1.0' encoding='UTF-8'?> 
<partial-response> 
    <changes> 
     <update id="docForm:idContrAcc"> 
      <![CDATA[<input id="docForm:idContrAcc" type="text" name="docForm:idContrAcc" style=" width : 100%;" />]]> 
     </update> 
     <update id="docForm:idNameContrBank"> 
      <![CDATA[<textarea id="docForm:idNameContrBank" name="docForm:idNameContrBank" style=" width : 130px;"></textarea>]]> 
     </update> 
     <update id="docForm:idBikContrBank"> 
      <![CDATA[<input id="docForm:idBikContrBank" type="text" name="docForm:idBikContrBank" style=" width : 140px;" />]]> 
     </update> 
     <update id="docForm:idAccContrBank"> 
      <![CDATA[<input id="docForm:idAccContrBank" type="text" name="docForm:idAccContrBank" style=" width : 140px;" />]]> 
     </update> 
     <update id="javax.faces.ViewState"><![CDATA[3312710224811729695:3995303008700914422]]> 
     </update> 
    </changes> 
</partial-response> 

有没有价值,但正确的标识!它是如何的?为什么?

但如果我回到NoSelectionOption活动的,那么页面得到响应

<?xml version='1.0' encoding='UTF-8'?> 
<partial-response> 
    <changes> 
     <update id="docForm:idContrAcc"> 
      <![CDATA[<input id="docForm:idContrAcc" type="text" name="docForm:idContrAcc" value="" style=" width : 100%;" />]]> 
     </update> 
     <update id="docForm:idNameContrBank"> 
      <![CDATA[<textarea id="docForm:idNameContrBank" name="docForm:idNameContrBank" style=" width : 130px;">SBER</textarea>]]> 
     </update> 
     <update id="docForm:idBikContrBank"> 
      <![CDATA[<input id="docForm:idBikContrBank" type="text" name="docForm:idBikContrBank" style=" width : 140px;" />]]> 
     </update> 
     <update id="docForm:idAccContrBank"> 
      <![CDATA[<input id="docForm:idAccContrBank" type="text" name="docForm:idAccContrBank" style=" width : 140px;" />]]> 
     </update> 
     <update id="javax.faces.ViewState"> 
      <![CDATA[3312710224811729695:3995303008700914422]]> 
     </update> 
    </changes> 
</partial-response> 

这似乎OK - 值呈现!但是为什么NoSelectionOption处于活动状态时会发生?

+0

等一下......你在使用PrimeFaces吗?难怪我从来没有听说过''。你用'richfaces'标记了你的问题,这是一个不同的库。 – 2011-05-31 09:17:08

+0

噢,作为一个方面说明,如果你使用泛型类型,但不想指定泛型,你可以使用类似于:'Set '和'List ',而不必使用'@SuppressWarnings( “rawtypes”)'。 – 2011-05-31 09:18:22

+0

我使用RichFaces 4.并且谢谢你注意:) – 2011-05-31 09:23:53

回答

1

我怀疑JSF可能会覆盖你的尝试,因为它通常会调用页面上所有属性的所有设置器,并且通常在执行valueChangeListener后执行此操作。我从未见过<a4j:ajax />标签,但您可以尝试<a4j:support />标签。取而代之的是:

<a4j:ajax event="valueChange" listener="#{paymentOrder.valueContractorChanged}" render="idINNContractor, idKPPContractor, idNameContractor, idContractorAccounts" execute="@this"/> 

试试这个:

<a4j:support event="onchange" ajaxSingle="true" reRender="idINNContractor, idKPPContractor, idNameContractor, idContractorAccounts"/> 

由于ajaxSingle="true"包括在标签就意味着只为curContractor的setter方法被调用(而不是所有像JSF页面上的其余部分通常会)。然后你可以从setter中调用valueContractorChanged(或者甚至让它成为setter的一部分)。

如果用这种方法替换所有的<a4j:ajax />标签,你应该得到想要的结果。通过上面的链接查看更多关于标签的信息。

+0

谢谢,但在RichFaces 3中使用,并且我使用RichFaces 4并且它不再有。 – 2011-05-31 09:19:20

+0

我明白了,您使用的是JSF 2.0内置的AJAX标签?对不起,我还没有任何经验。 – 2011-05-31 09:28:48