我在xhtml jsf页面的支持bean中显示来自列表的消息。
我正在使用ui:重复循环和每条消息的回复按钮。 在回复按钮上,我正在调用一个对话框,其中我显示了在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>
现在的问题是,当我点击回复时,它会显示对话框,但“收件人”部分包含列表中最后一条消息的sendername。
由于
答案 0 :(得分: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>
答案 1 :(得分:1)
你看到的是预期的行为,因为你做错了
首先,将对话移到ui之外:重复。
然后在对话框中设置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>
最后,在对话框中,使用#{messagesManagedBean.selectedMsg}