0

私は Primefaces 3.3.1 を使用していますが、質問があります。

p:dataTable の p:column 内に p:commandButton があります。以下に示すxhtmlでボタンをクリックするとオーバーレイメニューを表示できます。

    <p:commandButton id="btnID" icon="ui-icon-circle-triangle-s" style="height: 16px;">
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>
    <p:slideMenu overlay="true" trigger="btnID" my="left top" at="left bottom"
            model="#{bean.menuModel}"/>

この場合、bean.menuModel はすぐにメニュー データを返すことができます。しかし、メニューデータを準備するために前処理が必要な別のケースもあります。だから私もこれを持っています。

    <p:commandButton ajax="true" id="historyButton" action="#{bean.getHistory()}"
        icon="ui-icon-note" style="height: 16px;"
        onstart="workingDialog.show();"
        oncomplete="workingDialog.hide(); historyMenu.show();"> 
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>
    <p:menu overlay="true" widgetVar="historyMenu" my="left top" at="left bottom"
            model="#{searchBean.menuModel}"/> 

つまり、ボタンをクリックすると、その行のメニュー データのロードを開始する bean.getHistory() が呼び出され、円形のアイコンでモーダル ダイアログが表示されます。ロードが完了すると、ダイアログが消えてオーバーレイ メニューが表示されます。私ができないのは、このシナリオの最後の部分です。上記のコードは例外を発生させます。

java.lang.NullPointerException
    javax.faces.component.UIComponentBase.findComponent(UIComponentBase.java:561)
    org.primefaces.component.menu.BaseMenuRenderer.encodeOverlayConfig(BaseMenuRenderer.java:138)
    org.primefaces.component.menu.MenuRenderer.encodeScript(MenuRenderer.java:45)
    org.primefaces.component.menu.BaseMenuRenderer.encodeEnd(BaseMenuRenderer.java:39)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759)

以下に示すコードは、メニュー関連のコードなしで正常に動作します。

    <p:commandButton ajax="true" id="historyButton" action="#{searchBean.getHistory()}"
        icon="ui-icon-note" style="height: 16px;"
        onstart="workingDialog.show();"
        oncomplete="workingDialog.hide();"> 
        <f:setPropertyActionListener value="#{searchItem}" target="#{bean.selectedSearchItem}" />
    </p:commandButton>

これは専門家にとっては簡単な質問だと思います。oncomplete からオーバーレイ メニューを開くにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

0

この問題の解決策を見つけることができませんでしたが、私がやりたいことは、私が取り組んでいる環境では良い考えではないという結論に達しました。

まず、メニューが表示されているときではなく、データテーブルの行にデータが入力されているときに、メニューがBeanからデータを取得することに気付きました。また、メニューの遅延読み込みメカニズムはありません。したがって、ボタンをクリック->サーバーからメニューのデータを取得->メニューを開くことは期待どおりに実行できません(少なくとも私にはそう思われます)。

次に、メニューをDataTable(私の場合はTabViewの下)に配置すると、非常に奇妙な問題が発生することに気付きました。DataTableを更新すると、いくつかのajax関連の関数が機能しなくなります。この問題を説明して理解させたり信じさせたりすることはできませんが、私が取り組んでいるアプリでこの問題が発生しています。

そのため、アプリのDataTableにメニューを配置することを諦めました。ご清聴ありがとうございました。

私はこの答えを受け入れて、すでに低い受け入れ率を下げないようにします。

于 2012-06-21T04:20:07.683 に答える