【问题标题】:p:dialog shows empty values when when I go to the next page of the p:datatable using paginator当我使用分页器转到 p:datatable 的下一页时,p:dialog 显示空值
【发布时间】:2013-10-24 15:58:27
【问题描述】:

我一直在 p:datatable 中使用 onEdit,它工作正常。我的数据表有一个分页器,每页显示 5 条记录。所以当我在第一页事件中单击 onEdit 时。getObject 会在bean。现在当我转到下一页时,event.getObject 不起作用,只返回旧值。

与对话框相同。在表中我有一个链接,单击时会打开一个对话框,在该对话框中我使用所选行中的值填充几个字段。它在第一页中工作正常,当我导航到其他页面时pages 给出空值。

这是我的 jsf 代码:

 <p:dataTable value="#{mybean.userList}"
                             var="item"
                             id="dataTab"
                             widgetVar="usersTable"
                             tableStyleClass="data"  paginator="true" rows="5"  
                             filteredValue="#{userController.filteredUsers}"
                             editable="true"
                             rowKey="#{item}"
                             >
                    <p:ajax event="rowEdit"   listener="#{mybean.onEdit}" update=":userForm:growl" />  
                    <p:ajax event="rowEditCancel" listener="#{mybean.onCancel}" update=":userForm:growl" /> 
                    <f:facet name="header">
                    <p:outputPanel>  
                         <h:outputText value="Search all fields:" />  
                         <p:inputText id="globalFilter"     onkeyup="('usersTable').filter()"   style="width:150px" />  
                    </p:outputPanel>     
                    </f:facet>


                    <p:column sortBy="#{item.firstName}" filterBy="#{item.firstName}" 
                              filterMatchMode="startsWith">
                         <p:cellEditor> 
                        <f:facet name="header">  
                        <h:outputText value="First Name" />  
                        </f:facet>
                             <f:facet name="output">
                        <h:outputText  value="#{item.firstName}" />
                             </f:facet>
                             <f:facet name="input">  
            <p:inputText value="#{item.firstName}" style="width:100%"/>  
        </f:facet>  
                          </p:cellEditor>
                    </p:column>
                    <p:column  sortBy="#{item.lastName}" filterBy="#{item.lastName}" filterMatchMode="startsWith">
                        <p:cellEditor> 
                        <f:facet name="header">  
                        <h:outputText value="Last Name" />  
                        </f:facet>

                    <p:column headerText="Update" style="width:6%">  
                     <p:rowEditor />  
                    </p:column>    




                                        </p:dataTable>


<p:dialog id="modalDialog"
                                          header="Delete User?"
                                          modal="true"
                                          resizable="false"
                                          draggable="false"
                                          widgetVar="delUserConf"
                                          >  

                   <h:panelGrid id="display" columns="2" style="width: 150px;">
                                        <h:outputLabel value="Firat Name"  style="font-weight: bold"/>

                                        <h:outputText value="Last Name"  style="border: none"/>

                                    </h:panelGrid>

                                </p:dialog>

这是我的 bean 中用于编辑功能的代码:

public String onEdit(RowEditEvent event)
    {
User user=(User)event.getObject());
      user.getFirstName();
}

我没有在我的表单中添加弹出对话框的链接。另外我读到这可能是因为延迟加载,我不确定。我正在用列表填充我的表,而不是模型。

你能告诉我我应该怎么做才能让它工作吗?

【问题讨论】:

  • 你用的是什么manegedbeanand这些
  • 使用视图范围的 bean

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

也许您应该切换到 SessionBean 范围,因为范围视图会在视图发生更改时被释放。试试 SessionBean。你也可以像这样从视图范围调用任何 sessionbean,其中 controladorMB 是一个 sessionbean

 public void detallesPersona() {
    try {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ValueExpression vex = ctx.getApplication().getExpressionFactory().createValueExpression(ctx.getELContext(), "#{controladorMB}", ControladorMB.class);
        ControladorMB gMB = (ControladorMB) vex.getValue(ctx.getELContext());
        this.setSelectedPersona(gMB.getPersonaBean().detallesPersonas(this.selectedPersona.getIdPersona()));

    } catch (Exception e) {
        JsfUtil.addErrorMessage(e, "Error: " + e.getMessage());
    }
}

【讨论】:

  • 是不是因为使用了SessionScoped bean?如果我们使用 ViewScoped bean,还有其他选择吗?
  • 在 viewscope 中注册的托管 bean 只要用户停留在同一个视图上就保持可用。离开该视图将导致在该视图范围内注册的 bean 被释放。如果您想保留数据,请使用应用程序或会话范围
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-03-21
  • 2015-07-07
  • 2022-11-04
  • 2011-08-02
  • 1970-01-01
相关资源
最近更新 更多