从没有刷新页面的JSF dataTable中删除行

时间:2013-05-06 15:23:56

标签: jsf primefaces

接受了JSF的新手,但我已经在线跟踪了一些示例,但没有成功。这似乎是想要做的直截了当的事情。我们在持久层中使用Hibernate,并希望一次性从可编辑的dataTable列表中保存包含详细信息和相关实体记录的页面。

表格上方的页面上有2个命令按钮 - 添加角色和删除角色。 dataTable由PrimeFaces(3.5)SelectableDataModel支持(fyi:我尝试用通用JSF替换所有特定的PrimeFaces。我尝试用简单的集合进行支持)。单击“添加角色”后,后备操作方法将创建一个新对象并添加到该集合中。页面中的表立即反映了这一点,我可以打开行进行编辑和更改默认值。但是,当我单击删除时,后备操作方法将查找所有选定的行,我可以在调试器中看到正确的对象从集合中删除,但随后页面再次加载,我最终再次使用相同的列表。 (我在bean init()中停了一下。最初尝试使用确认对话框,但删除了没有运气,尝试了update =,ajax =等的变化。无法粘贴所有尝试,但此代码来自最后一次传递 -

<h:form id="dataTableForm">
<div class="row marginTop">
....

<div class="btn-toolbar">
    <p:commandButton value="#{msgUserSetup['btnAddRole']}"
        title="#{msgUserSetup['btnAddRole']}" id="btnAddRole"
        icon="envicon-med-plus envicon-white"
        styleClass="btn btn-primary"
        action="#{userSetupBean.addContext}" update="@form"/>

    <p:commandButton value="#{msgUserSetup['btnDeleteRole']}"
        title="#{msgUserSetup['btnDeleteRole']}"
        icon="envicon-med-trash envicon-white"
        styleClass="btn btn-danger" 
        action="#{userSetupBean.removeContexts}"  ajax="true" update="userContexts"/>
</div>
...
<p:dataTable id="userContexts" var="userContext" styleClass="marginTop"
    value="#{userSetupBean.contextsEditList}" 
    editable="true" editmode="row"
    paginator="true" rows="5" rowKey="#{userContext.id}"
    paginatorTemplate="{PreviousPageLink} {PageLinks} {NextPageLink}"
    rowsPerPageTemplate="5" paginatorPosition="bottom">

    <p:ajax event="rowSelect" listener="#{userSetupBean.onRowSelect}"  /> 
    <p:ajax event="rowEditInit" listener="#{userSetupBean.onEditInit}"  /> 
    <p:ajax event="rowEdit" listener="#{userSetupBean.onEdit}"  />   
    <p:ajax event="rowEditCancel" listener="#{userSetupBean.onCancel}"  /> 

    <p:column>
        <h:selectBooleanCheckbox value="#{userSetupBean.checked[userContext.id]}" />
    </p:column>
             ....

UserSetupBean代码: init()是post构造方法,其中SiteUser selectUser是从会话中提取的,它具有由Hibernate急切加载的UserContext集合。对于每一个,我实例化一个ContextEditObject对象,该对象充当每个放入新List的“编辑缓冲区”。这就是支持dataTable的原因。 addContext()将新的ContextEditObject添加到列表中 onEdit(RowEditEvent事件)将返回到非编辑状态的行,对象中保存更改,而onCancel()将执行一些回滚工作。 removeContext()从集合中删除选定行中表示的对象。

@PostConstruct
public final void init() {
FacesContext fCtx = FacesContext.getCurrentInstance();

selectedUser = (SiteUser) ((HttpSession) fCtx.getExternalContext().getSession(false))
    .getAttribute(SessionAttributes.SELECTED_USER.attributeName());
...
List<UserContext> userContexts = selectedUser.getUserContexts();
for (UserContext userContext:userContexts) {
    persistentContextsMap.put(userContext.getId(), userContext);
    ContextEditObject editObject = new ContextEditObject(userContext);
    contextsEditList.add(editObject);   
...


public final void addContext() {

try {
    UserContext newContext = hierarchyUserBridgeService
        .createNewUserContextLockedAtlevel(findViewForLevel(selectedUser.getLevel().getLevelId()),
            selectedUser);
    int listElement = contextsEditList.size();
    newContext.setId("NEW" + listElement);
    contextInView = new ContextEditObject(newContext);
    contextsEditList.add(listElement, contextInView);
...



public final String removeContexts() {

    int size = 0; //selectedContexts.length;
    List<String> checkedItems = new ArrayList<String>();

    for (ContextEditObject ctx : contextsEditList) {
        if (checked.get(ctx.getId())) {
            checkedItems.add(ctx.getId());
            size++;
        }
    }
    ...
    for (String ctxId : checkedItems) {
        ContextEditObject ctx = contextsEditMap.get(ctxId);
        contextsEditMap.remove(ctxId);
        contextsEditList.remove(ctx);
        if (!ctx.getId().startsWith("NEW")) {
            this.deletedContexts.add(ctx);
        }

    }
    ...

非常感谢任何帮助。感谢

0 个答案:

没有答案