0

我有一个具有多项选择(复选框)的数据表。每次标记此复选框时,都会再次执行数据表的选择。

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)

4

0 回答 0