1

テストコンポーネント1を含むメインページがあり、テストコンポーネント2が含まれています。Ajax呼び出しはtestcomponent2にあります。呼び出しはjavascriptで開始されますが、コントローラーにヒットすることはありません。ajax呼び出しがtestcomponent1に移動されると、呼び出しがトリガーされ、コントローラーに到達します。参考までにテストコードを含めています。

テストコントローラー:

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.AjaxBehaviorEvent;

@ManagedBean
@ViewScoped
public class TestController implements Serializable {
/** <code>serialVersionUID</code> */
private static final long serialVersionUID = -999213365169849345L;

private int customerkey;

private String customerName;

public void processKeyChange(AjaxBehaviorEvent e){
    System.out.println("I am in the Ajax method and my value is: " + customerkey);
}

//GETTERS AND SETTERS
public int getCustomerkey() {
    return customerkey;
}
public void setCustomerkey(int customerkey) {
    this.customerkey = customerkey;
}
public String getCustomerName() {
    return customerName;
}
public void setCustomerName(String customerName) {
    this.customerName = customerName;
}
}

testPage.xhtml

    <ui:define name="searchCriteria">
        <h:form id="orderHeaderForm" prependId="false">

            <h:panelGroup id="orderDiv" layout="block">
                <com:testcomponent1  id="testComponent1"
                                    customerKey="#{testController.customerkey}"
                                    customerName="#{testController.customerName}"/>

            </h:panelGroup>
        </h:form>
    </ui:define>

</ui:composition>

testcomponent1.xhtml

<cc:interface>
<cc:attribute name="customerKey" type="java.lang.Integer" />
<cc:attribute name="customerName" type="java.lang.String" />
</cc:interface>

<cc:implementation>
<h:panelGroup id="#{cc.clientId}" layout="block">
    <com:testcomponent2 id="testcomponent2" 
                key="#{cc.attrs.customerKey}"
                name="#{cc.attrs.customerName}" />

</h:panelGroup>
</cc:implementation>

testcomponent2.xhtml

<cc:implementation>
<h:panelGrid id="#{cc.clientId}" columns="2" border="0" cellspacing="0"     cellpadding="0">
    <h:outputLabel id="customerid" for="txtcustomerKey"/>
    <h:inputText id="txtcustomerKey" value="#{cc.attrs.key}" onchange="alert (document.getElementById(this.id).value)">
        <f:ajax event="change" listener="#{testController.processKeyChange}" execute="@this" render="txtCustomerName" />
    </h:inputText>
    <h:outputLabel id="customerName" for="txtCustomerName"/>
    <h:outputText value="#{cc.attrs.name}" id="txtCustomerName" />
</h:panelGrid>

</cc:implementation>

ありがとう

4

2 に答える 2

1

問題はにあると思います<h:panelGrid id="#{cc.clientId}"...>。デフォルトでは、複合コンポーネントはUINamingContainerのインスタンスであるため、代わりに任意の名前でIDを設定して使用できます。idフィールドでEL式を避けることをお勧めします。

于 2012-08-03T18:11:12.307 に答える
0

JSFコンポーネントのIDとして再割り当てするのではなく、または#{cc.clientId}などの単純なバニラHTML要素のIDとして再割り当てする必要があります。<span><div>

<span id="#{cc.clientId}">

また

<div id="#{cc.clientId}">
于 2012-08-03T19:58:03.053 に答える