Ok. Solved. I didn't realized that I was using the <x:commandLink> with immediate="true", so the Update Model phase wasn't invoked...
Thanks for the support. On 5/9/05, Broekelmann, Mathias <[EMAIL PROTECTED]> wrote: > > > > -----Original Message----- > > From: Enrique Medina [mailto:[EMAIL PROTECTED] > > Sent: Sunday, May 08, 2005 7:25 PM > > To: Broekelmann, Mathias > > Subject: Re: DataTable discussion > > > > > > Hi again, > > > > I've been making some testing, and I've come the the conclusion that > > your solution only works with session scoped beans, doesn't it? > > > > What needs to be done so it can work with request scoped beans? I've > > tried to put a setter (setValuesModel), bu it doesn't get called... > > > > On 5/6/05, Broekelmann, Mathias <[EMAIL PROTECTED]> wrote: > > > > > > > > > - You don't have to use a component binding to get access to the > > > datamodel. Simply return an instance of DataModel by the method > > > getValuesModel() instead of the List. You can use the > > existing DataModel > > > instances like ListDataModel - see javadoc for more subclasses of > > > DataModel. > > > > > > - Hold the returned DataModel in an instance variable to > > get the current > > > row of the datatable > > > > > > - Keep in Mind: the datatable component uses the same > > instance of the > > > returned DataModel instance to iterate through the rows. > > > > > > - I think you just forget it: to use value binding you must wrap the > > > statements like this: #{bean.valuesModel} > > > > > > Mathias > > > > > > > -----Original Message----- > > > > From: Enrique Medina [mailto:[EMAIL PROTECTED] > > > > Sent: Friday, May 06, 2005 3:18 PM > > > > To: Broekelmann, Mathias > > > > Cc: MyFaces Discussion > > > > Subject: Re: DataTable discussion > > > > > > > > > > > > Thanks for your comments Mathias. > > > > > > > > I am currently using both the value and a binding to do it: > > > > > > > > The JSF-Page contains: > > > > > > > > <h:dataTable value="bean.valuesModel" binding="mDataModel" > > > > var="object"> > > > > <h:column> > > > > <h:commandLink action="#{bean.chooseObjectAction}"> > > > > <x:outputText value="#{object.someProperty}" /> > > > > </h:commandLink> > > > > </h:column> > > > > </h:dataTable> > > > > > > > > The Bean contains: > > > > > > > > public class SomeBeanClass > > > > { > > > > UIData mDataModel; > > > > > > > > // Here goes the setter and the getter for the UIData object. > > > > > > > > public List getValuesModel() > > > > { > > > > return initializeValues(); > > > > } > > > > > > > > public String chooseObjectAction() > > > > { > > > > Object currentObject = this.mDataModel.getRowData(); > > > > } > > > > } > > > > > > > > Does this makes sense? > > > > > > > > On 5/6/05, Broekelmann, Mathias <[EMAIL PROTECTED]> wrote: > > > > > Hi Enrique, > > > > > > > > > > I use an instance of javax.faces.model.DataModel as a > > value for the > > > > > datatable. The value is held by a bean which holds the > > > > instance of the > > > > > DataModel. The DataModel instance is used to iterate > > > > through the rows of > > > > > the datatable. When an action is called on a row I only > > > > have to get the > > > > > current row from the DataModel to find the row on which the > > > > action was > > > > > called. > > > > > > > > > > The JSF-Page contains: > > > > > > > > > > <h:dataTable value="bean.valuesModel" var="object"> > > > > > <h:column> > > > > > <h:commandLink action="#{bean.chooseObjectAction}"> > > > > > <x:outputText value="#{object.someProperty}" /> > > > > > </h:commandLink> > > > > > </h:column> > > > > > </h:dataTable> > > > > > > > > > > The Bean contains: > > > > > > > > > > public class SomeBeanClass > > > > > { > > > > > DataModel mValueModel; > > > > > > > > > > public DataModel getValuesModel() > > > > > { > > > > > if(mValueModel == null) > > > > > { > > > > > mValueModel = new ListDataModel(initializeValues()); > > > > > } > > > > > return mValueModel; > > > > > } > > > > > > > > > > public String chooseObjectAction() > > > > > { > > > > > Object currentObject = getValuesModel().getRowData(); > > > > > } > > > > > } > > > > > > > > > > Hope this helps a little bit. > > > > > > > > > > Mathias > > > > > > > > > > > > > > > > -----Original Message----- > > > > > > From: Enrique Medina [mailto:[EMAIL PROTECTED] > > > > > > Sent: Thursday, May 05, 2005 6:58 PM > > > > > > To: MyFaces Discussion > > > > > > Subject: DataTable discussion > > > > > > > > > > > > > > > > > > Hi, > > > > > > > > > > > > I would like to know your opinion about how to work > > with DataTable > > > > > > using MyFaces in the typical example where a list of > > objects is > > > > > > presented and a link for each object is generated so as > > > > to go to some > > > > > > kind of maintenance form. > > > > > > > > > > > > IMHO this can be achieved using several approaches: > > > > > > > > > > > > 1) Bind the DataTable component to a property in a > > JSF bean; then > > > > > > create an action in the bean and associate it to the > > > > CommandLink so > > > > > > whenever the link is clicked, the action will be invoked, > > > > and you will > > > > > > be able to get the current object with dataTable.getRowData(): > > > > > > > > > > > > <x:dataTable var="object" > > binding="#{ObjectBean.objectDataTable}" > > > > > > preserveDataModel="true"> > > > > > > <h:column> > > > > > > <x:commandLink > > action="#{ObjectBean.chooseObjectAction}" > > > > > > immediate="true"> > > > > > > <x:outputText value="#{object.someProperty}" /> > > > > > > </x:commandLink> > > > > > > </h:column> > > > > > > </x:dataTable> > > > > > > > > > > > > 2) Just give the value of the DataTable a collection of > > > > objects, but > > > > > > use an UpdateActionListener to know which object was > > > > clicked (as now > > > > > > you don't have the getRowData() available). This results > > > > in a setter > > > > > > in our JSF bean being invoked when the link is clicked: > > > > > > > > > > > > <x:dataTable var="object" value="#{ObjectBean.listOfObjects}" > > > > > > preserveDataModel="true"> > > > > > > <h:column> > > > > > > <x:commandLink action="nextPage" immediate="true"> > > > > > > <x:outputText value="#{object.someProperty}" /> > > > > > > <x:updateActionListener value="#{object.id}" > > > > > > property="#{ObjectBean.id}" /> > > > > > > </x:commandLink> > > > > > > </h:column> > > > > > > </x:dataTable> > > > > > > > > > > > > In my tests, the update action method in the JSF bean > > doesn't get > > > > > > invoked if I set preserveDataModel="false". Don't know why... > > > > > > > > > > > > 3) Similar to 2, but using request parameters instead of the > > > > > > UpdateActionListener, that can be later obtained from > > within the > > > > > > action in the JSF bean: > > > > > > > > > > > > <x:dataTable var="object" value="#{ObjectBean.listOfObjects}" > > > > > > preserveDataModel="true"> > > > > > > <h:column> > > > > > > <x:commandLink > > action="#{ObjectBean.chooseObjectAction}" > > > > > > immediate="true"> > > > > > > <x:outputText value="#{object.someProperty}" /> > > > > > > <f:param value="#{object.id}" /> > > > > > > </x:commandLink> > > > > > > </h:column> > > > > > > </x:dataTable> > > > > > > > > > > > > And then from the JSF bean, get the parameters using the > > > > FacesContext > > > > > > through the getParametersMap() method. > > > > > > > > > > > > What do you currently use? What do you think is the > > best approach? > > > > > > What are the alternatives? > > > > > > > > > > > > An also, what happens when the DataModel must survive between > > > > > > different requests, for example, when using tabs? Is the > > > > only solution > > > > > > to make the JSF bean session scoped? > > > > > > > > > > > > Looking forward to hearing your comments ;-) > > > > > > > > > > > > > > > > > > > > >