在DataTable列上应用过滤器后,选择了错误的行进行编辑

时间:2012-01-23 05:28:20

标签: primefaces

问题是这样的:

假设dataTable中有记录,其中FruitType为A(表示Apple)和O(表示橙色)。呈现页面时,将过滤Apple的记录。当用户在Orange上过滤并选择第10条记录以便在rowEdit模式下进行编辑时,会在提交更改时调用rowEdit侦听器。在rowEdit侦听器中,rowEditEvent.getObject()给出了Apple Type的第10条记录。

我的代码附在下面......

<p:dataTable value="#{beanDetails.list_FruitDetails}" rowEditListener="#{beanDetails.handleRowEdit}" var="dataItem">
  <p:column filterBy="#{dataItem.FRUITTYPE}" filterOptions="#{beanDetails.options}" filterMatchMode="exact">  
    <f:facet name="header">
        <h:outputLabel value="Fruit Type" />
    </f:facet>
    <h:outputLabel id="fruitType" value="#{dataItem.FRUITTYPE}" />
  </p:column>
</p:dataTable>


@ManagedBean(name="beanDetails")
@ViewScoped
public class Fruits implements Serializable{
public Fruits () throws Exception {
    private SelectItem[] options;
    options = new SelectItem[2]; 
    options[0] = new SelectItem("A", "Apple");
    options[1] = new SelectItem("O", "Orange");
}

public List<FruitDetails> list_FruitDetails;

public void handleRowEdit(RowEditEvent re) throws ParseException {
    FruitDetails pd = (FruitDetails) re.getObject();
    System.out.println(pd.ITEMCODE);
}
}

3 个答案:

答案 0 :(得分:1)

这似乎是关于primefaces的一个错误,这个链接声明它已经在最后一个版本上解决了 http://code.google.com/p/primefaces/issues/detail?id=3467

答案 1 :(得分:0)

由于无法克服这个问题,我放弃了让primefaces提供过滤器的想法。现在我提供了selectOneRadio来指定FruitType并在数据表中加载特定Fruit Type的记录。

答案 2 :(得分:0)

经过一整天这个奇怪的bug之后,我和你有同样的问题。终于我找到了答案!
这对我有用:
我的环境:

primefaces 5.3
Mojarra 2.0.2
weblogic 10.3.3

主要问题是当我们在数据表上应用过滤器时,在初始阶段,它通过在 filter()中调用此方法将过滤后的数据存储在视图状态中:

updateValue(filterdData)

过滤后,当我们进行行选择或行编辑时,必须在调用实际方法之前恢复视图,以便使用过滤后的数据更新DataTable类中的数据
遗憾的是,Mojarra 2.0.2实施并未处理还原视图阶段作为较新版本,导致DataTable中的数据未更新之前的任何其他版本过滤后的ajax帖子
所以我只需下载新的Mojarra 2.2.8版本,并在我的weblogic.xml文件中添加旧版本替换旧版本:

<wls:container-descriptor>
    <wls:prefer-application-packages>
        <wls:package-name>com.sun.faces.*</wls:package-name>
        <wls:package-name>javax.faces.*</wls:package-name>
    </wls:prefer-application-packages>
</wls:container-descriptor>

通过这种方法,weblogic服务器将加载新的类文件,并按预期正确处理恢复视图阶段。

<强>更新
Mojarra的实现版本不一定完全是2.2.8,实际上,如果你使用像2.5这样的旧版本的servlet,新版本可能会导致其他问题。所以只需使用相应jsf版本的最新Mojarra即可。例如,2.0.11 for jsf 2.0

相关问题