jsf-2 - 如何使用 primefaces 可选数据表迭代 HashMap

标签 jsf-2 primefaces datatable facelets uirepeat

我尝试过不同的解决方案,但没有一个适用于我的情况。我希望此数据表中的所有行都是可选的。问题似乎是 <ui:repeat这可能会覆盖对象...

我的 bean :

@ManagedBean
@ViewScoped
public class Chat {

    private static Map<String, List<ChatObject>> chat = new LinkedHashMap<String, List<ChatObject>>();
    private ChatObject selectedChatObject;

    public void onChatRowSelection(){
        if(getSelectedChatObject() != null){
            System.out.println("test");
        }
    }

    public List<Map.Entry<String, List<ChatObject>>> getChatList() {
        Set<Map.Entry<String, List<ChatObject>>> productSet = chat.entrySet();
        return new ArrayList<Map.Entry<String, List<ChatObject>>>(productSet);
    }

    @PostConstruct
    public void postConstructMethod() { 

        if(chat.isEmpty()){

            List<ChatObject> objectsList1 = new ArrayList<ChatObject>();
            objectsList1.add(new ChatObject("3369818", "1", "1"));
            objectsList1.add(new ChatObject("3369819", "2", "2"));
            objectsList1.add(new ChatObject("3369820", "3", "3"));

            chat.put("Chat Topic 1", objectsList1);

            List<ChatObject> objectsList2 = new ArrayList<ChatObject>();        
            objectsList2.add(new ChatObject("3369813", "4", "4"));
            objectsList2.add(new ChatObject("3369815", "5", "5"));
            chat.put("Chat Topic 2", objectsList2);
        }

    }

    public ChatObject getSelectedChatObject() {
        return selectedChatObject;
    }

    public void setSelectedChatObject(ChatObject selectedChatObject) {
        this.selectedChatObject = selectedChatObject;
    }
}

我的 JSF:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:p="http://primefaces.org/ui"
    xmlns:fn="http://java.sun.com/jsp/jstl/functions">

<h:form id="form" enctype="multipart/form-data" acceptcharset="ISO-8859-1">

<ui:repeat value="#{chat.chatList}" var="chatEntry">

    <h2><h:outputText value="#{chatEntry.key}" /></h2>
    <br />

    <p:dataTable 
        value="#{chatEntry.value}" 
        var="chatEntryVar"
        widgetVar="chatTableWV" 
        styleClass="geralBorderless"
        style="cursor:pointer" 
        rowKey="#{chatEntryVar.id}" 
        rendered="true"
        selectionMode="single" 
        selection="#{chat.selectedChatObject}"
        paginatorAlwaysVisible="false">

        <p:ajax event="rowSelect"
            listener="#{chat.onChatRowSelection}" 
            oncomplete="chatTableWV.unselectAllRows();">

        </p:ajax>

        <p:column>
            <h:outputText value="#{chatEntryVar.name}" />
        </p:column>
    </p:dataTable>

</ui:repeat>
</h:form>
</html>

所有 5 ChatObject在我的 map 中已成功显示在我的页面中。但是onChatRowSelection方法仅当我点击与添加到我的 map 的second列表相关的行时打印“test”:objectList2 . 当我点击我添加的第一个列表中的行时 objectList1 , 当系统输入 onChatRowSelection方法,selectedChatObject将为空。我该如何解决这个问题?

最佳答案

你的问题在这里:

<ui:repeat ...>
    <p:dataTable ... widgetVar="chatTableWV">
       <p:ajax ... oncomplete="chatTableWV.unselectAllRows();">

多个数据表被赋值完全一样widgetVar JavaScript 范围内的名称。实际上,生成了以下 JavaScript 代码:

window['chatTableWV'] = new Widget(tableElement1);
window['chatTableWV'] = new Widget(tableElement2);
window['chatTableWV'] = new Widget(tableElement3);
// ...

基本上,每次迭代都会覆盖分配给声明的 widgetVar 的最后一个对象名称,直到它最终引用最后一个。最后一个小部件所期望的所有小部件基本上都不可用,导致它们在行选择方面不再起作用。

通过给他们每个人一个独特的 widgetVar 来相应地修复它.您可以使用 <ui:repeat> 的迭代索引为此。

<ui:repeat ... varStatus="loop">
    <p:dataTable ... widgetVar="chatTableWV_#{loop.index}">
       <p:ajax ... oncomplete="chatTableWV_#{loop.index}.unselectAllRows();">

这样就生成了下面的 JavaScript 代码:

window['chatTableWV_0'] = new Widget(tableElement1);
window['chatTableWV_1'] = new Widget(tableElement2);
window['chatTableWV_2'] = new Widget(tableElement3);
// ...

最后 PrimeFaces 小部件管理器可以找到它们。

关于jsf-2 - 如何使用 primefaces 可选数据表迭代 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27089830/

相关文章:

java - Richfaces Bootstrap 与使用 Twitter Bootstrap 的 Primefaces

google-maps - 如何在不刷新整个 Gmap 组件的情况下在 Gmap 上绘制多边形?

c# - 如何从 DataTable 的最后一行中检索值?

javascript - 将 row.add 用于带有复选框的数据表

c# - DataTable 和 ASP.NET Repeater

java - 从javascript onload事件执行managebean方法

java - 创建自己的标签时嵌套 EL 表达式

css - 更改宽度过滤器输入框 primefaces 数据表

java - 如何终止 View 作用域 bean 中的线程?

mysql - org.hibernate.AssertionFailure : null id in entry (don't flush the Session after an exception occurs)