0

現在、primefaces 3.3 を使用していますが、このバージョンはデータテーブルをサポートevent="rawToggle"していません。onExpandStartそのため、 の代わりにを使用することにしましたrowToggleが、別の問題に遭遇しました。ここでは、展開された行として別のデータテーブルを配置したいので、 で 1 つの行を切り替えるたびに、その行のnodetableを渡して、そのノードのすべてのコンテンツを取得する必要があります。"があれば問題なくできます! でも、dataTable の属性を使用すると で が取得できません。解決方法を知っている人はいますか? の中に隠し input タグを入れてみました。 , しかし、私が得る値は null です. 数日間取り組んできましたが、まだアイデアがありません. 助けてくださいお願いします!nodeIdbackingbeanevent="rowToggleonExpandStartsomenode.nodeIdbackingbean<input type="hidden" name="hidden" value="#{somenode.nodeId}"/>rowTogglerbackingbean

<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何らかの種類のものでない場合、それが a で値として機能するかどうかはわかりませんp:dataTable

あなたのクラスがどのように見えるかわかりませんので、上記は単なるアイデアです。

また、複数のフォームをそれ自体に入れるのではなく、h:form前後に置いたことにも注意してください。これは、AJAX、選択などの複数の場合に必要です。フォームをネストすることはできません。p:dataTablep:dataTable

于 2012-08-22T11:18:07.610 に答える