0

所以,我有一个这样的数据表:

<p:dataTable var="object" value="#{objectBean.objects}"
            paginator="true" rows="10" editable="true" id="tableObjects"

            paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
            rowsPerPageTemplate="5,10,15" style="border: 0px">

            <p:column sortBy="#{object.etc}">
                ..
            </p:column>

            ...

            <p:column sortBy="#{object.someValue}" id="sucessoColumn"
                headerText="Value">
                <p:cellEditor>
                    <f:facet name="output">

                        <h:outputText  value="#{object.someValue}" />
                    </f:facet>
                    <f:facet name="input">
                        <p:selectOneMenu value="#{object.someValue}" effect="fade"
                            id="opt">
                            ...
                        </p:selectOneMenu>
                    </f:facet>
                </p:cellEditor>
            </p:column>



            <p:column id="bColumn" headerText="Options">

                <p:rowEditor />
            </p:column>
            <p:ajax event="rowEdit" listener="#{objectBean.update}"></p:ajax>

        </p:dataTable>

在接收如下参数的页面上:

<f:metadata>
        <f:viewParam name="id" value="#{objectBean.object}"
            converter="#{objectConverter}" converterMessage="Converter error !"
            required="true" requiredMessage="Missing object !" />
    </f:metadata>

页面加载后,完全没有问题,一切正常。但是当我单击下一页或尝试编辑该行时,会出现来自视图参数的“所需消息”。当数据表上的任何内容发生更改时,参数似乎会消失。

有任何想法吗 ?谢谢你。

4

2 回答 2

0

问题在于我们使用的 Bean 的范围。似乎,每次数据表的状态发生变化时,它都会对 bean 发出另一个请求。如果它是请求范围的,则该参数仅适用于第一个请求。

改用 ViewScope 解决了一半的问题。数据表正常工作,但消息仍然出现。采用“required”和“requiredMessage”属性解决了问题的最后一部分,一切都很顺利。

于 2012-12-22T19:51:23.533 回答
0

也许我的回答为时已晚,但我遇到了和你一样的问题。

我将从您的代码中解释我的解决方案。

我不知道为什么,但是当您使用延迟加载和单元格编辑器时,rowEdit 功能不起作用。

<p:ajax event="rowEdit" listener="#{objectBean.update}"></p:ajax>

如果您从代码中删除 cellEditor,您将看到 objectBean.update 方法将运行。

我删除

<p:ajax event="rowEdit" listener="#{objectBean.update}"></p:ajax>

在每个单元格编辑器中,我将我的代码更改为这个。

<p:column sortBy="#{object.someValue}" id="sucessoColumn" headerText="Value">                      <p:cellEditor>
  <f:facet name="output">
   <h:outputText  value="#{object.someValue}" />
  </f:facet>
  <f:facet name="input">
   <p:selectOneMenu value="#{object.someValue} effect="fade" id="opt">
    <p:ajax event="valueChange" process="@this" listener="#{objectBean.update(object)}"/>
   </p:selectOneMenu>
  </f:facet>
 </p:cellEditor>
</p:column>

在 Bean 中,将更新方法从第一个更改为第二个。

public void update(RowEditEvent event) {
    Object editingRow = (Object) event.getObject();
    objectService().saveOrUpdate(editingRow);
}

public void update(HospitalDoctor obj) {
    objectService().saveOrUpdate(obj);
}

这样我解决了我的问题,希望对其他人有所帮助。

于 2016-04-21T10:34:22.940 回答