我有一个JSF复合组件,它包含一个h:形式的根。表单中有许多组件,其中包括selectOneMenu和h:inputFile。当我在窗体上设置enctype =“multipart / form-data”时,仅为两个值更改事件调用selectOneMenu的valuechangelistener。稍后,无论我与菜单交互,都不会调用值更改侦听器。但是,如果我删除enctype =“multipart / form-data”,那么每件事都可以。我必须保持enctype =“multipart / form-data”,因为我有一个文件上传组件。
这是我的Bean:
@Model
@ViewScoped
public class TransactionBean implements Serializable {
private Part inReceiptFilePart;
/*setter and getter*/
private TransactionType transactionType;
/*setter and getter*/
private final TransactionType transTypeList[] = {
TransactionType.COMPLETE,TransactionType.TECHNICAL,TransactionType.SUBMUNICIPALITY_TECHNICAL, TransactionType.COMPLAINT, TransactionType.FOLLOWUP_COUNCIL, TransactionType.FOLLOWUP_MANAGEMENT
};
public TransactionType[] getTransTypeList() {
return transTypeList;
}
public void transactionTypeChanged(ValueChangeEvent event) {
... /// some code
}
}
这是JSF复合组件:
<h:form id="entryForm" enctype="multipart/form-data">
<p:selectOneMenu id="transType" value="#{transactionBean.transactionType}" style="direction: ltr" valueChangeListener="#{transactionBean.transactionTypeChanged}">
<f:ajax execute="transType" render="@form" > </f:ajax>
<f:selectItems value="#{transactionBean.transTypeList}" var="tt" itemLabel="#{tt.arName}">
</f:selectItems>
</p:selectOneMenu>
<h:inputFile value="#{transactionBean.inReceiptFilePart}" > </h:inputFile>
<p:commandButton id="insertTrans" value="أدخل المعاملة" action="#{transactionBean.insertTransaction}" ajax="false">
</p:commandButton>
</h:form>
环境是JSF 2.2,Glassfish 4.0和primefaces 3.5。
请帮帮我。我在这个问题上被困了三天。
由于
答案 0 :(得分:0)
这是非常奇怪的行为!
尝试将valueChangeListener事件更改为AJAX调用。
<p:selectOneMenu id="transType" value="#{transactionBean.transactionType}" style="direction: ltr" >
<p:ajax event="change" partialSubmit="true" update="@form" listener="#{transactionBean.transactionTypeChanged}"/>
<f:selectItems value="#{transactionBean.transTypeList}" var="tt" itemLabel="#{tt.arName}" />
</p:selectOneMenu>
扩展JSF AJAX的Primefaces's AJAX component is behavior组件。 它添加和管理新事件(例如valueChange);它还会自动将javascript事件重新附加到DOM元素。
你的情况是jsf的ajax没有将valueChange Listener重新绑定到&#34; transType&#34;当表单是mutipart时selectOneMenu! (这很奇怪,因为行为应该与那些ajax事件相同,天气形式是多部分或www形式编码!