0

/subviews/document-tree.xhtmlクライアントの各タブのツリーをレンダリングするFacelets サブビューがあり<rich:tabPanel>ます。ページとサブビューは、JSF 2 と RichFaces 4 に基づいています。

<ui:composition ...>
  <rich:tree value="#{rootNode}" var="treeNode" id="#{treeId}">

    <rich:treeNode ... id="chapternode">

      <h:panelGrid columns="2">
        <rich:outputText value="#{treeNode.name}" />
        <h:commandLink>
          <h:graphicImage library="images/icons" name="delete.png"  />
          <rich:componentControl target="remove-chapter-popup" operation="show" />
        </h:commandLink>
        <rich:popupPanel modal="true"
                         onmaskclick="#{rich:component('remove-chapter-popup')}.hide(); return false;"
                         id="remove-chapter-popup">
          <f:facet name="header">
            <h:outputText value="Remove chapter?" />
          </f:facet>
          <f:facet name="controls">
            <h:outputText value="X" />
          </f:facet>
          <p>Remove chapter #{treeNode.name}?</p>
          <h:panelGrid columns="2">
            <h:commandButton value="Add"
                             action="#{nodeManager.removeChapterNode(treeNode)}" 
                             onclick="#{rich:component('remove-chapter-popup')}.hide(); return true;">

              <!--f:ajax execute="@this" render="@form" /-->        <!-- never executed! -->
              <a4j:ajax execute="@this" render="@form" />           <!-- this works however! -->

            </h:commandButton>
            <h:commandButton value="Cancel"
                             onclick="#{rich:component('remove-chapter-popup')}.hide(); return false;" immediate="true" />
          </h:panelGrid>
        </rich:popupPanel>
      </h:panelGrid>

    </rich:treeNode>

    ...

  </rich:tree>
</ui:composition>

これは基本的に、ツリー ノードとその名前、および右側に削除用のイメージを表示します。

各ツリー サブビューは に配置される<rich:tab>ため、タブ パネルに必要な囲いがあり<h:form>ます。他にネストされたフォームはありません (とにかく禁止されています)。

#{nodeManager.removeChapterNode(treeNode)}Bean は として正しくマークされました@ViewScoped

今何が起こるかはちょっと奇妙です:

<f:ajax execute="@this" ... />ボタンを使用すると実行されませんが、使用すると<a4j:ajax execute="@this" ... /> 常に機能します。

なんで?ここで何が問題なのですか?

RichFaces自身の言葉によると、RichFaces<a4j:ajax>が JSF 2 に 100% 基づいているという事実を考えると、あまり意味がありません。<f:ajax>

私が使用しているJSF 2.1.7 のバグでしょうか? (JBoss AS 7.1.1.Final に付属する実装)

4

2 に答える 2

0

ID にスペースを使用することはできません。UIComponent#setId()javadocも参照してください。

セットID

public abstract void setId(java.lang.String id)

これのコンポーネント識別子を設定しますUIComponent(存在する場合)。コンポーネント識別子は、次の構文制限に従う必要があります。

  • 長さゼロの文字列であってはなりません。
  • 最初の文字は文字またはアンダースコア ('_') でなければなりません。
  • 後続の文字は、文字、数字、アンダースコア ('_')、またはダッシュ ('-') でなければなりません。

コンポーネント識別子は、次のセマンティック制限にも従う必要があります (この制限はsetId()実装によって強制されないことに注意してください)。

  • UIComponent指定された識別子は、 である最も近い祖先の子孫であるすべてのコンポーネント (ファセットを含む) の間で一意である必要がありNamingContainerますNamingContainer

パラメータ:

  • idUIComponent- 新しいコンポーネント識別子、またはこれがコンポーネント識別子を持たないことを示す null

投げる

  • IllegalArgumentException- id が構文的に有効でない場合

RichFaces は、ツリーのルールに従って検証していないようです。私はそれを RichFaces のバグと考えます。RichFaces の担当者に報告してください。

于 2012-05-02T11:55:45.450 に答える
0

縮小された差分は次のとおりです。

<form id="tree-form" name="tree-form" method="post" action="/pqgenerator2/debug.jsf" enctype="application/x-www-form-urlencoded">
 ...
  <table style="margin: 0 auto;">
    <tbody>
      <tr>
- <td><input id="tree-form:sorting-tree-one:real root:j_idt34" type="submit" name="tree-form:sorting-tree-one:real root:j_idt34" value="Fortfahren" onclick="jsf.util.chain(this,event,'RichFaces.$(\'tree-form:sorting-tree-one:real root:add-root-chapter-popup\').hide(); return true;','mojarra.ab(this,event,\'action\',\'@this tree-form:sorting-tree-one:real root:new-root-chapter-name-input\',\'@form\')');return false" /></td>
+ <td><input id="tree-form:sorting-tree-one:real root:j_idt34" type="submit" name="tree-form:sorting-tree-one:real root:j_idt34" value="Fortfahren" onclick="jsf.util.chain(this,event,'RichFaces.$(\'tree-form:sorting-tree-one:real root:add-root-chapter-popup\').hide(); return true;','RichFaces.ajax(this,event,{&quot;parameters&quot;:{&quot;javax.faces.behavior.event&quot;:&quot;action&quot;,&quot;org.richfaces.ajax.component&quot;:&quot;tree\\u002Dform:sorting\\u002Dtree\\u002Done:real root:j_idt34&quot;} ,&quot;sourceId&quot;:this} )');return false" /></td>
      </tr>
    </tbody>
  </table>
...

- </div></span></span></div></div><input type="hidden" name="tree-form:sorting-tree-one__SELECTION_STATE" id="tree-form:sorting-tree-one__SELECTION_STATE" class="rf-tr-sel-inp" value="" /><script type="text/javascript">new RichFaces.ui.Tree("tree\u002Dform:sorting\u002Dtree\u002Done",{"toggleType":"client"} );</script></div></div><script type="text/javascript">new RichFaces.ui.Tab("tree\u002Dform:j_idt21",{"index":0,"leave":null,"togglePanelId":"tree\u002Dform:tree\u002Dtabpanel","switchMode":"client","name":"Blah GmbH","enter":null,"disabled":false} )</script></div><script type="text/javascript">new RichFaces.ui.Tab("tree\u002Dform:j_idt21",{"index":0,"leave":null,"togglePanelId":"tree\u002Dform:tree\u002Dtabpanel","switchMode":"client","name":"Blah GmbH","enter":null,"disabled":false} )</script></div><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="998210192617713914:-9142017502724223608" autocomplete="off" />
+ </div></span></span></div></div><input type="hidden" name="tree-form:sorting-tree-one__SELECTION_STATE" id="tree-form:sorting-tree-one__SELECTION_STATE" class="rf-tr-sel-inp" value="" /><script type="text/javascript">new RichFaces.ui.Tree("tree\u002Dform:sorting\u002Dtree\u002Done",{"toggleType":"client"} );</script></div></div><script type="text/javascript">new RichFaces.ui.Tab("tree\u002Dform:j_idt21",{"index":0,"leave":null,"togglePanelId":"tree\u002Dform:tree\u002Dtabpanel","switchMode":"client","name":"Blah GmbH","enter":null,"disabled":false} )</script></div><script type="text/javascript">new RichFaces.ui.Tab("tree\u002Dform:j_idt21",{"index":0,"leave":null,"togglePanelId":"tree\u002Dform:tree\u002Dtabpanel","switchMode":"client","name":"Blah GmbH","enter":null,"disabled":false} )</script></div><input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="-5805340602741883884:1908800949269113937" autocomplete="off" />
</form>

ここでの問題は、RichFaces ルートを表示するためのダミー ルート ノードを作成し、キーにスペースを含むRichFacesTreeNodeImplのを介して実際のルートを追加することです。addChild("real root", ...)

<a4j:ajax>コードは明らかにこれを処理できますが、JSF 2 は処理できません(<f:ajax>最初の差分部分に注意してください)。

于 2012-05-02T11:03:13.400 に答える