由f:setPropertyActionListener设置的属性在后续的ajax请求中变为null

时间:2015-07-06 19:40:19

标签: ajax jsf jsf-2 datatable setpropertyactionlistener

民间,

我在使用JSF ajax渲染事件时遇到了奇怪的行为。我有一个 h:datatable ,其中包含一个操作列,如下例所示:

<h:panelGroup id="myPanel">
                                <h:dataTable value="#{myController.data}" var="element" rendered="#{not empty myController.data}">
                                <h:column>
                                    <f:facet name="header">
                                        <h:outputText value="Test"/>
                                    </f:facet>
                                    <h:outputText value="#{element.status}"/>
                                </h:column><h:column>
                                    <f:facet name="header">
                                        <h:outputText value="Action"/>
                                    </f:facet>
                                    <h:form>


                                        <h:commandButton id="generateXML" value="Generate" onclick="openModal('#confirmModal')">
                                            <f:ajax execute="@this"/>
                                            <f:setPropertyActionListener for="generateXML" target="#{myController.selectedElement}" value="#{element}" />
                                        </h:commandButton>


                                    </h:form></h:column></h:datatable></h:panelGroup>

我有一个模式调用myController上的action方法。主要部分:(注意模态和数据表格是不同的)

 <h:commandButton value="Confirm" action="#{myController.create()}" onclick="$('#confirmModal').modal('hide');">
                    <f:ajax execute="@this" render=":myPanel"/>
                </h:commandButton>

奇怪的行为:

第一次执行此代码时,这可以正常工作, f:setPropertyActionListener 的操作以及更新表数据的渲染。但是如果我再次尝试执行相同的操作, f:setPropertyActionListener 不起作用,给我一个NPE。如果我重新加载页面,它的工作原理。

这里发生了什么?

修改

null的部分是#{myController.selectedElement}。重新渲染后不再执行此ajax。

我的控制器代码:

@ManagedBean
@ViewScoped
public class MyController implements Serializable {

   private Object element;

   // This method is called only once. If render the panelGroup (render=":myPanel")
   public void setSelectedJob(final XmlJob selectedJob) {
     this.selectedJob = selectedJob;
   }

}

0 个答案:

没有答案