jsf inputText不执行更改侦听器事件

时间:2014-08-12 23:08:32

标签: ajax jsf jsf-2 richfaces

我有两个.xhtml页面,其中包含两个相似的inputText元素("客户ID"以及"客户名称"),两个页面中的inputText为"客户ID&#34 ;启动请求ajax事件以查找客户的名称并将其放在"客户名称"的inputText中。 当我运行Web应用程序并使用第一页时,一切正常,但如果我不使用第一页并转到第二页(通过第一页中的commandlink)而不使用第一页,则使用inputText进行搜索客户名称不起作用,实际上没有进入testBean2.searchCustId方法。

代码:

第一页

<h:form>
    <h:commandLink action="page2">PAGE 2</h:commandLink><br/>
    <h:outputText value="customer id: "/>
    <h:inputText id="custoId" label="CUSTOMER_ID" value="#{testBean.custId}" required="true">
        <a4j:ajax event="change" listener="#{testBean.searchCustId(testBean.custId)}" render="custoName"/>
        <f:validateLength minimum="1" maximum="12"/>
    </h:inputText>
    <rich:message for="custoID" ajaxRendered="true"/>
    <h:outputText value="Customer name: "/>
    <h:inputText id="custoName" label="CUSTOMER_NAME" value="#{testBean.custName}"/>
    <rich:message for="custoName" ajaxRendered="true"/>
</h:form>

第二页

<h:form>
    <h:outputText value="customer id: "/>
    <h:inputText id="custoId2" label="CUSTOMER_ID2" value="#{testBean2.custId}" required="true">
        <a4j:ajax event="change" listener="#{testBean2.searchCustId(testBean2.custId, 0)}" render="custoName2"/>
        <f:validateLength minimum="1" maximum="12"/>
    </h:inputText>
    <rich:message for="custoId2" ajaxRendered="true"/>
    <h:outputText value="customer name: "/>
    <h:inputText id="custoName2" label="CUSTOMER_NAME2" value="#{testBean2.custName}"/>
    <rich:message for="custoName2" ajaxRendered="true"/>
</h:form>

现在是jsf托管bean

testBean这个

public class TestBean {

    private String custId;
    private String custName;

    public TestBean() {
    }

    //getter and setter

    public void searchCustId(String ced){
        custName = ced + "- SOME CUSTOMER NAME"; //THIS IS FOR TESTING
    }
}

testBean2

public class TestBean2 {

    private String custId;
    private String custName;

    public TestBean2() {
    }

    //getter and setter

    public void searchCustId(String ced, int que){
        custName = ced + " - " + que; //THIS IS FOR TESTING
    }
}

可能会发生什么?

我对此很新,而且我的英语不好:)

1 个答案:

答案 0 :(得分:1)

您可以使用f:setPropertyActionListener

<a4j:ajax event="change" listener="#{myBean.listener}">
  <f:setPropertyActionListener target="#{myBean.someProperty}" value="your_value_here"/>
</a4j:ajax>

但是从您的代码中看起来您正试图传递h:inputText上使用的唯一值,这不是必需的:

<h:inputText id="custoId" label="CUSTOMER_ID" value="#{testBean.custId}" required="true">
        <a4j:ajax event="change" listener="#{testBean.searchCustId}" render="custoName"/>
        <f:validateLength minimum="1" maximum="12"/>
</h:inputText>

在Ajax事件之后,值testBean.searchCustId将在传递验证后自动在Managed bean上更新,因此您的监听器可能是:

public class TestBean {

    private String custId;
    private String custName;

    public TestBean() {
    }

    //getter and setter

    public void searchCustId(){
        custName = custId + "- SOME CUSTOMER NAME"; //THIS IS FOR TESTING
    }
}