【问题标题】:How to realize rowToggle in primefaces 3.3?如何在 primefaces 3.3 中实现 rowToggle?
【发布时间】:2012-08-21 20:04:59
【问题描述】:

我现在使用的是 primefaces 3.3,但这个版本不支持 event="rawToggle" 用于数据表。所以我选择使用onExpandStart而不是rowToggle,但是我遇到了另一个问题。这里我想把另一个数据表作为展开的行,所以每次我在nodetable 中切换一行时,我需要将该行的nodeId 传递给backingbean 以获取该节点的所有内容。如果我有event="rowToggle",我可以毫无问题地做到这一点!但是如果我使用dataTable的属性onExpandStart,我无法在backingbean中获取somenode.nodeId,有人知道如何解决吗? 我还尝试在rowToggler 中放置一个隐藏的输入标签<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>,但我在backingbean 中得到的值为空。 已经研究了几天,但仍然没有任何想法。请帮帮忙!

<p:dataTable id="nodetable" value="#{nodeedit.list}" var="somenode"
             styleClass="datatable" editable="true" 
             onExpandStart="#{nodeedit.toggle(somenode.nodeId)}" >
   <p:ajax event="rowEdit" listener="#{nodeedit.save('node')}"/>

       <p:column style="width:4%">
          <p:rowToggler>
             <h:form>
               <input type="hidden" name="hidden" value="#{somenode.nodeId}"/>
             </h:form>
          </p:rowToggler>
       </p:column> 

       <p:column>
          <f:facet name="header">ID</f:facet>
             <h:form>
                <h:commandLink action="nodeedit">#{somenode.norder}</h:commandLink>
             </h:form>
       </p:column>

       <p:column headerText="Name">
           <p:cellEditor> 
              <f:facet name="output"> 
                <h:outputText value="#{somenode.title}" /> 
              </f:facet> 
              <f:facet name="input"> 
                 <p:inputTextarea value="#{somenode.title}" style="width:100%"/> 
              </f:facet> 
           </p:cellEditor> 
       </p:column>

       <p:column headerText="Edit" style="width:50px"> 
           <p:rowEditor /> 
       </p:column>

       <p:rowExpansion>
               <p:dataTable id="contentId" var="content" 
                            value="#{nodeedit.contents}" id="contents" editable="true"> 
                  <p:ajax event="rowEdit" listener="#{nodeedit.save('content')}"/>

                  <p:column headerText="Text" style="width:450px"> 
                     <p:cellEditor> 
                        <f:facet name="output"> 
                            <h:outputText value="#{content.text}" escape="false" /> 
                        </f:facet> 
                        <f:facet name="input"> 
                            <p:inputTextarea value="#{content.text}" style="width:100%"/> 
                        </f:facet> 
                     </p:cellEditor> 
                   </p:column> 

                   <p:column headerText="Edit" style="width:50px"> 
                      <p:rowEditor /> 
                   </p:column> 

          </p:dataTable> 
       </p:rowExpansion>
  </p:dataTable>

我也尝试过另一种方法。 Node的Content也是一个对象,在Node Class中我已经定义了

       List<LibContent> contents = new ArrayList<LibContent>();

所以,就像 siebzOr 所说的那样,我在我的 jsf 中写道:

    <p:rowExpansion>
         <p:dataTable var="content" value="#{somenode.content}">

            **<p:ajax event="rowEdit" listener="#{nodeedit.save()}"/>**

            <p:column>
               <h:outputText value="#{content.someValue}" />
            </p:column>

            <!-- Other columns -->

         </p:dataTable>
    </p:rowExpansion>

在 backingbean nodeedit 中,我有

        public void save() {
            for (Content content : node.contents)
                  System.out.println("content.text");
        }

我发现无论我在页面中做什么,content.text 都不会改变。但是如果我直接在nodeedit中定义List&lt;Content&gt; contents = new ArrayList&lt;Content&gt;(),就可以得到新的值了!!这就是为什么我每次切换节点表然后更新backingbean 中的内容时都尝试获取nodeId 的原因。我做错了什么吗?

【问题讨论】:

    标签: datatable primefaces


    【解决方案1】:

    p:rowExpansion 是动态的并使用 AJAX 加载它的数据。像这样的东西应该可以工作:

    <h:form>
        <p:dataTable value="#{nodeedit.list}" var="somenode" styleClass="datatable">
            <p:column>
                <p:rowToggler />
            </p:column>
    
            <!-- Your columns here -->
    
            <p:rowExpansion>
                <p:dataTable var="content" value="#{nodeedit.contentOf(somenode)}">
    
                    <p:column>
                        <h:outputText value="#{content.someValue}" />
                    </p:column>
    
                    <!-- Other columns -->
    
                </p:dataTable>
            </p:rowExpansion>
        </p:dataTable>
    </h:form>
    

    在您的支持 bean 中,您应该有一个获取节点内容的方法,在我的示例中为 contentOf(Node node)

    @Named // or @ManagedBean
    @ViewScoped // or some other scope
    public class Nodeedit
    {
        private List<Node> list;
    
        //Getters and Setters
    
        public List<SomeClass> contentOf(Node node)
        {
            // get and return the content of the node
        }
    }
    

    如果您的Node 有获取Content 的方法,您可以改为执行以下操作:

    <p:rowExpansion>
        <p:dataTable var="content" value="#{somenode.content}">
    
            <p:column>
                <h:outputText value="#{content.someValue}" />
            </p:column>
    
            <!-- Other columns -->
    
        </p:dataTable>
    </p:rowExpansion>
    

    如果Node 的内容不是某种Collection,我不确定它是否可以在p:dataTable 作为值。

    我不知道您的课程是什么样的,所以以上只是一个想法。

    还要注意,我在p:dataTable 周围放置了一个h:form,而不是在p:dataTable 本身中放置多个表单。这对于 AJAX、选择等多种事情都是必需的。您不能嵌套表单。

    【讨论】:

    • 您好 siebzOr,谢谢您的回复!你的理解完全正确!节点的内容也是一个对象,我确实有一种方法可以在节点类中获取 node.contents。我已经尝试过您的第二种方法,通过“somenode.contents”获取内容,但问题是当我编辑内容表中的行时,backingbean 无法获取新值。我的 backingbean 称为 NodeEdit。我曾经在 content-table 中写过一个 ajax:,但是我在 save() 中得到的所有值都是旧值。不知道怎么解决...
    • @user1453951 我相信这是另一个问题。因为这个问题是关于“如何实现 rowToggle”。
    • @siebz 或者嗯,你是对的!可能我应该将标题更改为“如何将可编辑的表格嵌入另一个可编辑的表格”...好的,我将创建一个新帖子,如果您有任何想法,请让我知道让我知道!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多