0

我现在使用的是 primefaces 3.3,但是这个版本不支持数据event="rawToggle"表。所以我选择使用onExpandStart而不是rowToggle,但我遇到了另一个问题。在这里,我想将另一个数据表作为扩展行,所以每次我切换一行时nodetable,我都需要传递该nodeId行的backingbean以获取该节点的所有内容。如果我有event="rowToggle“,我可以毫无问题地做到!但是如果我使用onExpandStartdataTable的属性,我就无法进入somenode.nodeIdbackingbean有谁知道如何解决它?我也试过在<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>里面放一个隐藏的输入标签rowToggler,但是我得到的值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>

我也尝试过另一种方式。节点的内容也是一个对象,在我定义的节点类中

       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 都不会改变。但是如果我List<Content> contents = new ArrayList<Content>()直接在 中定义nodeedit,它可以得到新的值!!这就是为什么我nodeId每次切换节点表然后更新backingbean. 我做错了什么吗?

4

1 回答 1

0

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>

如果 aNode的内容不是Collection某种类型的,我不确定它是否会p:dataTable作为值起作用。

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

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

于 2012-08-22T11:18:07.610 回答