Search code examples
jsfmobileprimefacesfacelets

How to set selected item in bean in <p:dataList>


I am using p:dataList because I am developing a PrimeFaces mobile view displaying a list of items. When clicking on any item, another pm:view of the same view should be displayed. But the bean should be notified of the selected item.

Unfortunately I couldn't find a way to update the bean successfully: <p:ajax> inside dataTable throws this exception:

<p:ajax> Unable to attach <p:ajax> to non-ClientBehaviorHolder parent

Using <f:setPropertyActionListener> inside the iterative element fails too because I get:

<f:setPropertyActionListener> Parent is not of type ActionSource

This is my code:

<pm:view  id="instrumentsView" >
    <pm:content >
        <h:form id="instrumentsList" >                            
            <p:dataList var="instrument" value="#{instrumentBean.subscribedInstruments}" >
                <h:outputLink value="#newView" >#{instrument.longName}</h:outputLink>
                <f:setPropertyActionListener value="#{instrument}" target="#{instrumentBean.selectedInstrument}" />
            </p:dataList>
        </h:form>
    </pm:content>
</pm:view>

Clearly, I am using dataList and outputLink because as far as I understand, they are the components optimized for the use in PrimeFaces mobile lists. But I am available to find other options if necessary.


Solution

  • I found out in the showcase (example titled News) the correct way of handling the problem:

    <p:dataList var="instrument" value="#{instrumentBean.subscribedInstruments}" >
        <p:column >
            <p:commandLink value="#{instrument.longName}" action="pm:newView" update=":compId">
                <f:setPropertyActionListener value="#{instrument}" target="#{instrumentBean.selectedInstrument}" />
            </p:commandLink>
        </p:column>
    </p:dataList>