1

xhtmljsfページのバッキングBeanのリストからのメッセージを表示しています。

ループにはui:repeatを使用し、メッセージごとに返信ボタンを使用しています。返信ボタンで、xhtmlページに表示されているユーザー名を表示しているダイアログボックスを呼び出しています。ただし、リストの最後のメッセージ送信者の名前が常に表示されます。

私のxhtmlコードを見てください

<h:form>
                            <div id="messages">

                                <ui:repeat var="userMsg" value="#{messagesManagedBean.userInboxMsgs}">

                                    <p:dialog modal="true" widgetVar="messageDialog" resizable="false"  width="750" height="200" header="New Message" >  



                                        <h:panelGrid columns="2">
                                            <p:column>
                                                <h:outputLabel for="msgRecepient"  value="To"/>
                                            </p:column>
                                            <p:column>
                                                <h:outputLabel id="msgRecepient" value="#{userMsg.userFullname}"  >

                                                </h:outputLabel>
                                            </p:column>
                                            <p:column>
                                                <h:outputLabel for="msgContents"  value="Message"/>
                                            </p:column>
                                            <p:column>
                                                <p:inputTextarea id="msgContents" value="#{messagesManagedBean.msg.message}" cols="65" rows="3" />


                                            </p:column>


                                            <p:column>
                                                <p:commandButton id="msgSend" value="Send"  action="#{messagesManagedBean.sendMessage(userMsg.userId,'reply')}"   oncomplete="messageDialog.hide()"  /> 
                                            </p:column>

                                        </h:panelGrid>

                                    </p:dialog>

                                    <center><img class="h-diff" src="../images/differentiator-profile.jpg" width="437" height="1" /></center>
                                    <div class="message">
                                        <div id="senderImg">
                                            <img class="senderImg" src="../images/profile-pic.jpg" width="50" height="50" />
                                        </div>
                                        <div id="message-txt-area">

                                            <div id="senderName">
                                                <p:commandLink styleClass="senderName" value="#{userMsg.userFullname}" action="#{myProfileManagedBean.loadProfileFrontInformation(userMsg.userId)}"></p:commandLink>
                                            </div>
                                            <div class="message-txt">
                                                #{userMsg.message}
                                            </div>
                                            <div class="reply-btn">
                                                <a href="#" onclick="messageDialog.show()">Reply</a>
                                            </div>

                                        </div>
                                    </div>

                                </ui:repeat>

                            </div>
                        </h:form>

問題は、返信をクリックするとダイアログボックスが表示されますが、[宛先]セクションにはリストの最後のメッセージの送信者名が含まれていることです。

ありがとう

4

2 に答える 2

4

widgetVarに動的な値を指定していないため、widgetVarが上書きされていると思います。これは、常にmessageDialog値のままです。

ダイアログをループに入れるのは悪い習慣だと思います。タグを使用してパラメーターとして渡された変数値を使用<p:dialog>して呼び出すことにより、再利用することをお勧めします。<p:commandLink><f:param>

<ui:repeat var="userMsg" value="#{messagesManagedBean.userInboxMsgs}">
    ...
    <p:commandLink value="Reply" onclick="messageDialog.show()">
        <f:param name="userMsg" value="#{userMsg}" />     
    </p:commandLink>
    ...
</ui:repeat>

<p:dialog modal="true" widgetVar="messageDialog" resizable="false"
          width="750" height="200" header="New Message">
    <h:panelGrid columns="2">
        <p:column>
            <h:outputLabel for="msgRecepient" value="To"/>
        </p:column>
        <p:column>
            <h:outputLabel id="msgRecepient" value="#{userMsg.userFullname}" />
        </p:column>
        <p:column>
            <h:outputLabel for="msgContents" value="Message"/>
        </p:column>
        <p:column>
            <p:inputTextarea id="msgContents" cols="65" rows="3"
                             value="#{messagesManagedBean.msg.message}" />
        </p:column>
        <p:column>
            <p:commandButton id="msgSend" value="Send" 
            action="#{messagesManagedBean.sendMessage(userMsg.userId,'reply')}"
            oncomplete="messageDialog.hide()" />
        </p:column>
    </h:panelGrid>
</p:dialog>
于 2012-06-07T12:14:32.240 に答える
1

あなたが見ているのは、あなたが間違ったことをしているので、期待される振る舞いです。
まず、ダイアログをui:repeatの外に移動します。
次に、ダイアログ内でh:panelGridのIDを設定します(例: "dialogGrid")
。選択したメッセージとなる管理対象Beanに属性を追加します。
次のように置き換え<a href="#" onclick="messageDialog.show()">Reply</a>ます。

<p:commandLink value="Reply" update="dialogGrid" oncomplete="messageDialog.show()" >
        <f:setPropertyActionListener target="#{messagesManagedBean.selectedMsg}" value="#{userMsg}" />
</p:commandLink>

最後に、ダイアログで、#{userMsg}を使用して選択したメッセージを参照する代わりに、#{messagesManagedBean.selectedMsg}

于 2012-06-07T12:09:38.333 に答える