Jsf 当我使用paginator转到p:datatable的下一页时,p:dialog显示空值
我一直在p:datatable中使用onEdit,效果很好。我的数据表有一个pagintor,每页显示5条记录。因此,当我在第一页事件中单击onEdit时,getObject会在bean中获得更改的值。现在,当我转到下一页时,event.getObject不起作用,只返回旧值 与对话框相同。在表中,单击时我有一个链接,打开了一个对话框,我正在用所选行的值填充几个字段。它在第一页工作正常,当我导航到其他页面时,会给出空值 以下是我的jsf代码:Jsf 当我使用paginator转到p:datatable的下一页时,p:dialog显示空值,jsf,jsf-2,primefaces,datatable,Jsf,Jsf 2,Primefaces,Datatable,我一直在p:datatable中使用onEdit,效果很好。我的数据表有一个pagintor,每页显示5条记录。因此,当我在第一页事件中单击onEdit时,getObject会在bean中获得更改的值。现在,当我转到下一页时,event.getObject不起作用,只返回旧值 与对话框相同。在表中,单击时我有一个链接,打开了一个对话框,我正在用所选行的值填充几个字段。它在第一页工作正常,当我导航到其他页面时,会给出空值 以下是我的jsf代码: <p:dataTable value="#{
<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>
我没有在弹出对话框的表单中添加链接。我还了解到这可能是因为延迟加载,我对此不确定。我用列表填充我的表,而不是模型
你能告诉我该怎么做才能让它工作吗?也许你应该切换到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());
}
}
使用视图范围的bean是因为使用了会话范围的bean,所以您使用了什么样的管理bean?如果我们使用的是viewscope bean,还有其他选择吗?只要用户停留在同一个视图上,在viewscope中注册的托管bean仍然可用。离开该视图将导致取消分配在该视图作用域中注册的bean。如果要保留数据,请使用应用程序或会话范围
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());
}
}