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