【问题标题】:Selection doesn't propagate to backing bean with PrimeFaces datatable选择不会传播到 PrimeFaces 数据表的支持 bean
【发布时间】:2014-01-20 17:28:21
【问题描述】:

我刚开始学习 JSF 和 PrimeFaces,我很难让 PrimeFaces 的数据表正常工作。我有一个基于复选框的选择机制(可以同时选择多行),因此单击“删除选定用户”按钮会触发对支持 bean 的方法调用,以从数据库中删除相应的用户。

问题是所选行没有存储在支持 bean 的 selectedUsers 数组中,我不明白为什么,因为我的代码与 PrimeFaces ShowCase 上托管的代码完全相同。结果,该按钮成功触发了确认对话框,但从未从系统中删除任何用户。有人有什么建议吗?

提前谢谢你!

xhtml 文件

<h:form id="tableForm">
    <p:dataTable id="userList" var="user" value="#{userListBean.userList}"
                 selection="#{userListBean.selectedUsers}" rowKey="#{user.username}">
        <f:facet name="header">User list</f:facet>

        <p:column selectionMode="multiple" style="width:2%"/>

        <!-- data columns here, working just fine -->

        <f:facet name="footer">
            <p:commandButton value="Delete selected users" icon="ui-icon-trash" action="#{userListBean.deleteSelectedUsers()}">
                <p:confirm header="Deletion confirmation" message="Are you sure you want to delete #{fn:length(userListBean.selectedUsers)} users?" icon="ui-icon-alert" />                         
            </p:commandButton>
            Registered users: #{fn:length(userListBean.userList)}
        </f:facet>
    </p:dataTable>

    <p:confirmDialog global="true" showEffect="fade">
        <p:commandButton value="Yes" type="button" styleClass="ui-confirmdialog-yes" icon="ui-icon-check" />
        <p:commandButton value="No" type="button" styleClass="ui-confirmdialog-no" icon="ui-icon-close"/>
    </p:confirmDialog>
</h:form>

支持 Bean (userMgr 处理服务器上的持久性,它应该与我的问题无关)

@ManagedBean(name="userListBean")
@ViewScoped
public class UserListBean {
    @EJB
    private UserManager userMgr;
    private List<UserDTO> userList;
    private UserDTO[] selectedUsers;

    public UserListBean() {

    }

    public void deleteSelectedUsers() {
        for(UserDTO u : selectedUsers)
            userMgr.deleteUser(u.getUsername());

        setUserList(userMgr.retrieveAllUsersDTO());
    }

    public List<UserDTO> getUserList() {
        if(userList == null)
            setUserList(userMgr.retrieveAllUsersDTO());

        return userList;
    }

    public void setUserList(List<UserDTO> userList) {
        this.userList = userList;
    }

    public List<UserDTO> retrieveUserList() {
        return userMgr.retrieveAllUsersDTO();
    }

    public UserDTO[] getSelectedUsers() {
        return selectedUsers;
    }

    public void setSelectedUsers(UserDTO[] selectedUsers) {
        this.selectedUsers = selectedUsers;
    }

}

(作为一个附带问题:#{fn:length(userListBean.selectedUsers)} EL 表达式总是返回 0。我以前认为是因为选择机制损坏,但可能是因为在呈现确认对话框时数组仍然为空?)

【问题讨论】:

  • 不是答案:org.primefaces.model.LazyDataModel&lt;T&gt; 在这种情况下应该更可取。视图范围的 bean 必须实现 java.io.Serializable 接口。
  • 首先将getUserList 中的所有逻辑移动到一个用@PostConstruct 注释的方法中。然后你的 getUserList 应该只做它所说的:gets userList
  • 谢谢大家,我不知道@PostConstruct注解!还有很多要学的。像 kolossus 建议的那样纠正吸气剂后一切正常,即使我不明白它与我的问题有什么关系......

标签: jsf-2 primefaces


【解决方案1】:

您需要通过将&lt;p:ajax event="rowSelect"/&gt; 添加到dataTable 来激活事件rowSelect。

【讨论】:

  • 马克。作为。正确。
猜你喜欢
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多