我有一个带有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

最佳答案

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

基本上,它正在寻找客户端ID为formId:tableId:rmactionenumid的组件,而不是例如第二行formId:tableId:1:rmactionenumid。从技术上讲,<p:ajax>应该放在<p:column>内,但这对于rowEditInit事件不起作用。

您需要基于update组件(可作为UIData参数使用)组成自己的RowEditEvent客户端ID,并将组成的客户端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);

    // ...
}

08-05 01:49