我有一个带有多个选择的数据表(复选框)。每次标记此复选框时,都会再次执行数据表的选择。
XHTML:
<p:dataTable id="dtUsuarios"
widgetVar="usuarios" value="#{configGruposUsuariosMB.usuarios}"
var="usuario" paginator="true" rows="10"
paginatorPosition="bottom" scrollable="true" scrollHeight="82%"
rowsPerPageTemplate="5,10,15,30,50,100"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
emptyMessage="#{i18n.datatableVazia}" lazy="true"
currentPageReportTemplate="{currentPage}/{totalPages} #{i18n.paginas} - {startRecord} #{i18n.a} {endRecord} #{i18n.de} {totalRecords}"
filteredValue="#{configGruposUsuariosMB.usuarioFiltered}"
resizableColumns="true" rowIndexVar="rowIx"
selection="#{configGruposUsuariosMB.usuariosSelecionados}"
rowKey="#{usuario.id}" style="float: right; width: 99%; overflow: hidden;" >
<p:ajax event="rowSelectCheckbox" />
<p:ajax event="rowUnselectCheckbox"/>
<f:facet name="header">
<p:outputLabel value="#{i18n.usuarios}" style="float: left;" />
</f:facet>
<f:facet name="header">
<p:outputPanel>
<h:outputText value="#{i18n.pesquisaGlobal}:" />
<p:inputText id="globalFilter" onkeyup="usuarios.filter()"
style="width:70px" />
<p:watermark value="#{i18n.filtroGlobal}" for="globalFilter" />
</p:outputPanel>
</f:facet>
<p:column id="cbx" selectionMode="multiple" style="width:17px" />
<p:column id="nome" headerText="#{i18n.nomeCompleto}"
sortBy="#{usuario.nome}" style="width:35%;">
<h:outputText value="#{usuario.nome}" />
</p:column>
<p:column id="email" headerText="#{i18n.email}"
sortBy="#{usuario.email}" style="width:35%;">
<h:outputText value="#{usuario.email}" />
</p:column>
<p:column id="grupoAtual" headerText="#{i18n.grupoAtual}"
sortBy="#{usuario.grupoUsuario.descricao}" style="width:30%;">
<h:outputText value="#{usuario.grupoUsuario.descricao}" />
</p:column>
</p:dataTable>
MB(@ViewScoped):
@ManagedBean(name = "configGruposUsuariosMB")
@ViewScoped
public class ConfigGruposUsuariosMB {
@EJB
private GrupoUsuarioService grupoUsuarioservice;
@EJB
private UsuarioService usuarioService;
@Inject
private MessagesController messages;
private GrupoUsuario grupoUsuarioSelecionado;
private List<GrupoUsuario> gruposUsuarios;
private LazyDataModel<Usuario> usuarios;
private LazyDataModel<Usuario> usuariosGrupo;
private Usuario usuarioFiltered;
private Usuario usuarioGrupoFiltered;
private List<Usuario> usuariosSelecionados;
private List<Usuario> usuariosGrupoSelecionados;
private ETipoUsuario tipoUsuarioSelecionado;
// Buscar palavras da base de internacionalização
ResourceBundle i18n = ResourceBundle.getBundle("br.com.sales.messages.msg",
FacesContext.getCurrentInstance().getViewRoot().getLocale());
public GrupoUsuario getGrupoUsuarioSelecionado() {
return grupoUsuarioSelecionado;
}
public void setGrupoUsuarioSelecionado(GrupoUsuario grupoUsuarioSelecionado) {
this.grupoUsuarioSelecionado = grupoUsuarioSelecionado;
}
public List<GrupoUsuario> getGruposUsuarios() {
return gruposUsuarios;
}
public void setGruposUsuarios(List<GrupoUsuario> gruposUsuarios) {
this.gruposUsuarios = gruposUsuarios;
}
public LazyDataModel<Usuario> getUsuarios() {
if (usuarios == null) {
usuarios = new GenericLazyDataModel<Usuario>(
usuarioService.findAll());
}
return usuarios;
}
public void setUsuarios(LazyDataModel<Usuario> usuarios) {
this.usuarios = usuarios;
}
public ETipoUsuario getTipoUsuarioSelecionado() {
if (tipoUsuarioSelecionado == null)
tipoUsuarioSelecionado = ETipoUsuario.A;
if (gruposUsuarios == null || gruposUsuarios.isEmpty())
carregarListaGrupos(tipoUsuarioSelecionado);
return tipoUsuarioSelecionado;
}
public void setTipoUsuarioSelecionado(ETipoUsuario tipoUsuarioSelecionado) {
this.tipoUsuarioSelecionado = tipoUsuarioSelecionado;
carregarListaGrupos(tipoUsuarioSelecionado);
}
public List<SelectItem> getTiposUsuarios() {
List<SelectItem> tipos = new ArrayList<SelectItem>();
for (ETipoUsuario tipoUsuario : ETipoUsuario.getAll()) {
tipos.add(new SelectItem(tipoUsuario, i18n.getString(tipoUsuario
.getTipo())));
}
return tipos;
}
public void carregarListaGrupos(ETipoUsuario tipo) {
gruposUsuarios = grupoUsuarioservice
.findByTipoUsuario(tipoUsuarioSelecionado);
grupoUsuarioSelecionado = getGrupoUsuarioPadrao();
}
public GrupoUsuario getGrupoUsuarioPadrao() {
for (GrupoUsuario grupo : gruposUsuarios) {
if (grupo.isPadrao())
return grupo;
}
return new GrupoUsuario();
}
public LazyDataModel<Usuario> getUsuariosGrupo() {
List<Usuario> users = usuarioService
.findByGrupoUsuario((grupoUsuarioSelecionado != null ? grupoUsuarioSelecionado
: new GrupoUsuario()));
usuariosGrupo = new GenericLazyDataModel<Usuario>(users);
return usuariosGrupo;
}
public void setUsuariosGrupo(LazyDataModel<Usuario> usuariosGrupo) {
this.usuariosGrupo = usuariosGrupo;
}
public Usuario getUsuarioFiltered() {
return usuarioFiltered;
}
public void setUsuarioFiltered(Usuario usuarioFiltered) {
this.usuarioFiltered = usuarioFiltered;
}
public Usuario getUsuarioGrupoFiltered() {
return usuarioGrupoFiltered;
}
public void setUsuarioGrupoFiltered(Usuario usuarioGrupoFiltered) {
this.usuarioGrupoFiltered = usuarioGrupoFiltered;
}
public List<Usuario> getUsuariosGrupoSelecionados() {
return usuariosGrupoSelecionados;
}
public void setUsuariosGrupoSelecionados(
List<Usuario> usuariosGrupoSelecionados) {
this.usuariosGrupoSelecionados = usuariosGrupoSelecionados;
}
public List<Usuario> getUsuariosSelecionados() {
return usuariosSelecionados;
}
public void setUsuariosSelecionados(List<Usuario> usuariosSelecionados) {
this.usuariosSelecionados = usuariosSelecionados;
}
public void reset() {
usuariosSelecionados = null;
usuariosGrupoSelecionados = null;
usuarios = null;
getUsuarios();
usuariosGrupo = null;
getUsuariosGrupo();
}
public void adicionarUsuarios() {
List<Usuario> usersAtuais = ((GenericLazyDataModel<Usuario>) usuariosGrupo)
.getDatasource();
for (Usuario user : usuariosSelecionados) {
if (!user.getGrupoUsuario().equals(grupoUsuarioSelecionado)) {
user.setGrupoUsuario(grupoUsuarioSelecionado);
usersAtuais.add(user);
}
}
// teste...
usuarioService.merge(usuariosSelecionados);
// reset();
if (usuariosSelecionados != null)
usuariosSelecionados.clear();
if (usuariosGrupoSelecionados != null)
usuariosGrupoSelecionados.clear();
usuariosGrupo = null;
usuariosGrupo = new GenericLazyDataModel<Usuario>(usersAtuais);
messages.addInfo("msgSucessoParcial");
}
public void removerUsuarios() {
boolean error = false;
for (Usuario user : usuariosGrupoSelecionados) {
if (user.getGrupoUsuario().equals(usuariosGrupoSelecionados)) {
error = true;
continue;
} else {
user.setGrupoUsuario(getGrupoUsuarioPadrao());
}
}
reset();
if (error)
messages.addWarn("msgAvisoUsuarioGrupo");
messages.addInfo("msgSucessoParcial");
}
public void save() {
usuarioService.merge(usuariosSelecionados);
messages.addInfo("msgSucesso");
}
}
如果我删除<p:ajax event="rowSelectCheckbox" />
或更改为<p:ajax event="rowSelectCheckbox" process="@none"/>
,则不会调用方法“setUsuariosSelecionados(List usuariosSelecionados)”。
我只需要在标记复选框时调用“setUsuariosSelecionados(List usuariosSelecionados)”。
我正在使用JSF2,Primefaces 3.5
抱歉我的英文(googleTranslate = D)