primefaces datatable rowedit不更新单元格元素

时间:2014-01-03 10:25:07

标签: jsf primefaces datatable listbox

我有一个带有rowedit的数据表。 我的表的一列是一个带有列表框的单元格,列表框的项目是动态检索的(取决于另一个单元格中的值) 我使用rowEditInit来设置selectedrow项。我想更新列表框以检索正确的值。 这不起作用。 当我做的时候

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="orderitemstable" />

然后当我点击铅笔图标时,我可以看到行切换到编辑模式并重新启动列表框项目。但它直接切换回非编辑模式。

但是当我做的时候

<p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />

然后单击铅笔图标会将行置于编辑模式,但不会调用以检索列表框项目。我的观点是,它不会触发对rmactionenumid的更新。

有什么想法吗?

罗埃尔

这是我的jsf代码

            <p:ajax event="rowEditInit" listener="#{workOrderDetail.onEdit}" update="rmactionenumid" />


            <p:column >  
                <p:cellEditor>  
                    <f:facet name="output">  
                        <h:outputText id="rmactionenumidlabel" value="#{orderItem.rmActionRepr}" >
                        </h:outputText>
                    </f:facet>  
                    <f:facet name="input">  
                        <h:selectOneListbox id="rmactionenumid" value="#{orderItem.rmActionEnumId}" size="1" valueChangeListener="#{workOrderDetail.setActionRepr}">
                            <f:selectItems value="#{workOrderDetail.actionItems}"/> 
                            <p:ajax event="change" update="partdiscount,labourdiscount,totalprice,:detail:wodetail:totals" execute="@this"  />                                  
                        </h:selectOneListbox>   

                    </f:facet>  
                </p:cellEditor>  
            </p:column>
<p:column >
<p:rowEditor id="edit"  />                          
                </p:commandLink>

            </p:column>  
        </p:dataTable>

这是我的java bean代码

public List<SelectItem> getActionItems() throws MWSException {
    ArrayList<SelectItem> actions = new ArrayList<SelectItem>();
    if (getSelectedOrderItem() != null) {

        ListManager lm = new ListManager(getWA().getMwsProxy());
        MWSGenericMapList items = lm.nativeSearch(getWS().getUser(), HdfWebConstants.NS_VEHICLEPARTACTIONS, 0, 0, 200,
                false, getSelectedOrderItem().getVehiclePartCode());

        for (int i = 0; i < items.size(); i++) {
            actions.add(new SelectItem(items.get(i).get("rmaction_enumid").toString(), items.get(i).get("rmaction")
                    .toString()));
        }

    }
    return actions;
}

public void setSelectedOrderItem(IMWSOrderItem newSelectedOrderItem) throws MWSException {
    this.selectedOrderItem = newSelectedOrderItem;
}

public void onEdit(RowEditEvent event) throws MWSException {

    setSelectedOrderItem((IMWSOrderItem) event.getObject());

}

我正在使用PF3.5

5 个答案:

答案 0 :(得分:17)

失败是因为update="rmactionenumid"在此构造中相对于表本身而不是当前表行。

基本上,它正在寻找一个客户ID为formId:tableId:rmactionenumid的组件,而不是第二行formId:tableId:1:rmactionenumid。从技术上讲,<p:ajax>应放在<p:column>内,但这对rowEditInit事件无效。

您需要根据update组件提供自己的UIData客户端ID,该组件可用作RowEditEvent参数,并将组合的客户端ID添加到PartialViewContext#getRenderIds()

因此,请删除<p:ajax update>并扩展onUpdate()方法,如下所示:

public void onEdit(RowEditEvent event) {
    UIData table = (UIData) event.getComponent();
    String updateClientId = table.getClientId() + ":" + table.getRowIndex() + ":rmactionenumid";
    FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().add(updateClientId);

    // ...
}

答案 1 :(得分:3)

按照BalusC的回答:

由于您使用的是Primefaces 3.5,您可以选择使用其实用程序类ComponentUtils和RequestContext:

String actId = ComponentUtils.findComponentClientId( "rmactionenumid" );
RequestContext.getCurrentInstance().update( actId );

将与BalusC发布的代码段相同。

答案 2 :(得分:1)

我花了很长时间才弄清楚这一点。 BalusC一如既往地死钱,但逃脱我的是,更新Datatable不会像我预期的那样更新所有孩子。更新表确实更新了行(底层模型中已删除的行消失)并重新排序行(如果已重新排序基础模型),但CellEditor容器内的outputText小部件中的值不会更新,除非您已编辑,否则要更新的<p:ajax />标记,在我的情况下就是所有标记。我猜测有一个设计假设,当CellEditor启动Ajax调用时,Datatable父级只会更新编辑的子单元格。我永远不明白为什么CellEditor需要包含InputText和OutputText以便工作。

当多个用户在不同的会话中同时编辑相同的数据表时,这给我带来了可怕的问题。 UserA将进行编辑并获得正确更新的表,可能使用不同顺序的行。然后UserB,其Datatable现在已过时,将进行编辑,编辑将正确保存到数据库(因为该行具有唯一的隐藏ID)但编辑将转到Datatable中的错误行(但是正确的列)和UserB,即使在更新之后,也不会在不同的单元格中看到UserA的变化。一旦我将<p:ajax update="datatableID" />标记放在inputText主体中,它就能正常工作。我仍然有并发问题,我必须单独解决,但至少在编辑后数据表是正确的。

BalusC,如果你在外面,请在这里纠正我的错误假设。

答案 3 :(得分:0)

我遇到过同样的问题。你能做的是以下几点:

在更新方法下放置一个logger对象(或者你可以简单地编写一个system.out.println)来检查你的方法是否是从jsf页面访问的。如果是这样,请在那里写下你的行动。

对我来说,我已经检查过我的方法是否被访问过。在我看到之后,我的行记录仍未更新。我所做的是在方法下创建一个期望行的新对象,并通过getter / setter将行值的内容复制到我的新对象。然后我可以更新我的行。这种方式适合我。

答案 4 :(得分:0)

这可能对某人有所帮助。我有一个类似的问题,我在互联网上尝试了所有可能的事情。最终我放弃了,但后来偶然修好了。问题是我有多个&lt; H:形式&GT;在我的.xhtml中使用,并且由于某种原因没有传播更改。 希望它对某人有帮助。