You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by "Romanowski, Tim" <ti...@lmco.com> on 2006/11/07 20:25:05 UTC
Passing a RowId on MenuChange ... with a twist
Hey guys, I've got a tricky problem I'm hoping someone has run into
before. I have a dataTable with rows that, among other things, have a
selectOneMenu in them. Whenever I change the value of a menu, I want to
persist its new value in my database (I am using JPA...Glassfish'
implementation of EJB 3.0). The problem I'm having, is that once I get
the new value of the selectOneMenu in my updateTaskStatus backing bean
method, I don't have a way of knowing what the corresponding row is that
contained the selectOneMenu. I've found several _similar_ examples
using a selectOneMenu with the dataTable, but in all cases, they have
not set the initial value of their selectOneMenu to the value of their
table's DataModel.
As you can see, I am referencing "item.status", where "item" is the
current row in my dataTable. I am using item.status here because I need
to set the initial value of the selectOneMenu to whatever that
particular row's status is in the database. So, you could say I have a
persistence issue, because I should be able to persist my table's
Collection....instead, however, I would like to find out if there is a
way to also pass the currently selected row when the dropdown menu's
value is changed. With that, I could use my EntitManager's find method
to get a managed object of the particular row and persist the new value.
Unfortunately, f:param and f:attribute are null when my
valueChangeListener is fired.
I've tried pushing the execution of updateTaskStatus off to the
UPDATE_MODEL_VALUES phase, but they are still null at that point. I
tried both f:param and f:attribute because I am grasping at straws at
this point. (I was following related advice at [1]). I can pass the
row ID in my other datatables, but in this case I am using an
a4j:region...so I'm guessing it is skipping a number of phases in the
JSF lifecycle. Does anyone have a suggestion on how to accomplish this?
Is there an elegant way to do this?
<a4j:region selfRendered="true">
... datable definition and some columns ...
<h:column>
<f:facet name="header">
<h:panelGroup id="panelxyz">
<h:outputText
value="#{msg.status}" />
</h:panelGroup>
</f:facet>
<h:selectOneMenu
value="#{item.status}" title="Status"
valueChangeListener="#{task.updateTaskStatus}">
<f:selectItems
value="#{taskStatus.taskStatusSelectItems}"/>
<f:param name="updatedTaskId"
value="#{item.taskId}"/>
<f:attribute
name="updatedTaskId2" value="#{item.taskId}"/>
<a4j:support event="onchange"
onsubmit="if(!confirm('Are you sure you want to change the status?'))
{form.reset();
return false;}"
oncomplete="alert('New status succesfully stored.')" reRender="panelxyz"
/>
</h:selectOneMenu>
</h:column>
... some more columns ...
</a4j:region>
[1]
http://java-server-faces.blogspot.com/2006/04/valuechangelisteners-what-
you-need-to.html
Tim