3

私は非常に興味深い問題に遭遇しました。これが私のシナリオです:

私の目標

  • ネストされたツールチップでSelectManyCheckboxを使用します。
  • SelectManyCheckbox onHideイベントを使用して、Ajax(ActionListener)呼び出しを起動し、
  • SelectManyCheckboxラベルとネストされたツールチップテキスト。

私のアプローチ

  • remoteCommandを使用して、SelectManyCheckboxonHideイベントに関連付けます

XHTML

<p:selectCheckboxMenu id="sourceFilter"
                onHide="sourceFilterCommand();"
                value="#{viewRevenueBean.sourceSelectManyMenu.selectedValues}" 
                label="#{viewRevenueBean.sourceSelectManyMenu.label}"
                filter="true" filterMatchMode="contains"
                validator="#{viewRevenueBean.sourceSelectManyMenu.validate}"
                widgetVar="srcFilterDropDown">
                <f:selectItems id="sourceItems"
                              value="#{viewRevenueBean.sourceSelectManyMenu.availableItems}" 
                              var="source" itemLabel="#{source.label}" itemValue="#{source.value}" />
                <f:convertNumber type="number" />
                                    <p:tooltip id="srcToolTip" 
                                for="sourceFilter" 
                        value="#{viewRevenueBean.sourceSelectManyMenu.tooltipText}" 
                        showEffect="fade" 
                            hideEffect="fade"/>
                <p:remoteCommand name="sourceFilterCommand" update="sourceFilter"
                    actionListener=#{viewRevenueBean.sourceSelectManyMenu.defaultEventHandler}"/>       
</p:selectCheckboxMenu>

私の結果

  • Ajax(アクションリスナー)が起動され、SelectManyCheckboxラベルとネストされたツールチップが更新されます(予期される動作)。
  • Firebugで、各onHideイベントのAjax呼び出しが、先行するサーバー側の要求の数に2を掛けていることに気付きました(予期しない動作)。

例えば

1st onHide event  = 1 Request
2nd onHide event  = 2 Requests
3rd onHide event  = 4 Requests  
4th onHide event  = 8 Requests  
5th onHide event  = 16 Requests

等.....

これは明らかに望ましくなく、2回のonHideイベントの後で大幅に遅くなります。

私が試した実験

  • 目的のAjax呼び出しを実行し、要素の更新を修正するap:commandボタンを作成しました(乗算された要求の問題なしで)。次に、Firebugを介してAjax JavaScript呼び出しを盗み、それを自分のJavaScript関数に配置し、それをonHideコールバックとして使用しました。繰り返しますが、同じ望ましくない結果が発生し、ラベルとツールチップは更新されますが、リクエストは増え始めます。

  • remoteCommandを別の場所(メニューの外側、独自のフォームの内側など)に配置してみました。違いはありません。問題はまだ発生しています。

  • SelectManyCheckboxシナリオを単純化して(ツールチップ、カバーターを削除し、さまざまな属性を微調整するなど)、他の可能性を排除してみました。変わりはない。

  • onchangeを使用してp:remoteCommandの代わりにap:ajaxを試しました。Ajaxリクエストは正常に機能しますが、明らかに私が求めているものではありません。onHideでトリガーする必要があります。

  • SelectCheckboxMenuの代わりに、onchangeでSelectManyCheckbox(ラベルなし)を使用し、他のすべてを同じに保ってみました。remoteCommandは正常に機能し、Ajax呼び出しは一度呼び出され、すべてが素晴らしくてダンディです。[/ list] [list] *PrimeFaces3.5-SNAPSHOTも試してみました。変わりはない。問題はまだ現れています。

    この問題に関して、これまでのところフォーラムやネット上で手がかりは見つかりませんでした。これはバグやプログラマーの不器用さのように聞こえますか:roll :?もちろん、洞察や提案は大歓迎です。

4

1 に答える 1

0

p:remoteCommand を使用しているときに、同様の問題に遭遇しました。根本的な原因があなたの場合と同じであるとは断言できませんが、これは多少役立つかもしれません。

私の場合、問題はjqueryバインディングの多重登録によって引き起こされました。p:remoteCommand は $(somesource).off("some_event").on("some_event", some_function) を使用していないようです。つまり、私が理解している限りでは、p:remoteCommand を含むコンポーネントを更新すると、そのアクションは更新されるたびに何度も登録されます。つまり、p:remoteCommand の名前を呼び出した場合、登録された回数だけ起動します。

外に移動しようとしても同じ問題が発生するとおっしゃっていたので、結局この問題ではないのかもしれません。私の場合、代わりに ap:commandLink を使用してこの仮定をテストし、バッキング Bean を呼び出しました。私の目標は、バインディングの以前の登録が削除されていることを確認することでした。そのため、上記のようにバインディングを登録することによって:

$(somesource).off("some_event").on("some_event", some_function), some_function にリンクをクリックさせると、少なくとも問題が解決するかどうかを確認できます。

于 2013-01-22T13:33:57.933 に答える