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 ;-)
> >
>