CommandLink not working with Lazy Loaded Primefaces Datascroller

I am having a problem with lazy loading the Primfaces Datascroller component .

I have a jsf page that should display 10 events when the page loads. If the user wants to see more, he / she can press the button more to load and display the next 10 events. Each event line has a link that can be used to display information about the event.

    <h:form id="mainForm" >
        <p:dataScroller value="#{backing.lazyModel}" var="event" lazy="true" chunkSize="10" rowIndexVar="index">
            #{event.name}
            <p:commandLink class="view-trigger"
                value="View Event Details"
                actionListener="#{backing.initViewEventDetails(index, event)}"/>
            <f:facet name="loader">
                <p:outputPanel 
                        visible="#{backing.lazyModel.rowCount gt 10}"
                        rendered="#{backing.lazyModel.rowCount gt 10}">
                    <p:commandLink value="More" />
                </p:outputPanel>
            </f:facet>
        </p:dataScroller>
    </h:form>

The original search works fine, that is, when I click on the link for information about the event, my bean feedback is called, and I see that the index and the received events correspond to the line that I clicked on.

, , 1 , 11 , , . , 0, 10, 1, bean .

, datascroller 10 , , .

bean:

@ManagedBean(name="backing")
@ViewScoped
public class DataScrollerBacking implements Serializable {

private static final long serialVersionUID = 4012320411042043677L;
private static final Logger LOGGER = Logger.getLogger(DataScrollerBacking.class);

@ManagedProperty("#{settings.dataSource}")
private String dataSource;

private WebEventDAO webEventDAO;

private LazyDataModel<Event> lazyModel;

@PostConstruct
public void init() {
    webEventDAO = CommonDAOFactory.getInstance(dataSource).getWebEventDAO();
    search();
}

public void search() {
    DateTime start = new DateTime(2014, 1, 1, 0, 0 ,0);
    final Date startDate = start.toDate();
    final Date endDate = start.plus(Years.ONE.toPeriod()).minus(Seconds.ONE.toPeriod()).toDate();

    lazyModel = new LazyDataModel<Event>() {

        private static final long serialVersionUID = 1231902031619933635L;
        private LinkedHashSet<Event> eventCache; // Ordered set of all retrieved events so far.
        // I'm using a set because the load method is called twice on page load (any idea why???) and I don't want duplicates in my cache.

        @Override
        public List<Event> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) {
            List<Event> events = new ArrayList<Event>(10);
            try {
                if(eventCache == null){
                    int count = webEventDAO.getSearchByPeriodRaceTypeAndRaceStatusForCompanyCount(Collections.singletonList(1), startDate, endDate, null, null);
                    this.setRowCount(count);
                    eventCache = new LinkedHashSet<Event>(count);
                }
                events = webEventDAO.searchByPeriodRaceTypeAndRaceStatusForCompany(Collections.singletonList(1), startDate, endDate, null, null, true, first, pageSize);
                eventCache.addAll(events);
            } catch (DAOException e) {
                LOGGER.error("An error occurred while retrieving events.", e);
            }
            return events;
        }
    };

}

public void initViewEventDetails(Integer index, Event event){
    LOGGER.info("index=" + index + " eventname=" + event.getName());
}

public String getDataSource() {
    return dataSource;
}

public void setDataSource(String dataSource) {
    this.dataSource = dataSource;
}

public LazyDataModel<Event> getLazyModel() {
    return lazyModel;
}

public void setLazyModel(LazyDataModel<Event> lazyModel) {
    this.lazyModel = lazyModel;
}}

, , .

, , .

- , ?

Mojarra 2.2, Tomcat 7, 5, Omnifaces 1.8

+4
3

, . , , , .

, Primefaces DataScroller DataScroller LazyDataModel. , .

, , .

, :

html:

<h:form id="mainForm" >
    <p:dataScroller value="#{backing.events}" var="event" rowIndexVar="index">
        #{event.name}
        <p:commandLink class="view-trigger"
            value="View Event Details"
            action="#{backing.initViewEventDetails(index, event)}"/>

        <f:facet name="loader"><h:outputText value=""/></f:facet>
    </p:dataScroller>

    <p:commandLink value="More" process="@form" update="@form" 
        action="#{backing.loadMore()}"
        visible="#{backing.totalCount gt backing.events.size()}"
        rendered="#{backing.totalCount gt backing.events.size()}"/>
</h:form>

DataScroller lazy = "true", chunkSize = "10", , , ( , ), commandLink, backing.loadMore() , .

bean:

@Named("backing")
@ViewScoped
public class DataScrollerBacking implements Serializable {

private static final long serialVersionUID = 4012320411042043677L;

private static final Logger LOGGER = Logger.getLogger(DataScrollerBacking.class);

private static final Integer CHUNK_SIZE = 10;

@DataSource
@Inject
private String dataSource;

private WebEventDAO webEventDAO;

private List<Event> events;
private Integer totalCount;
private Date startDate;
private Date endDate;

@PostConstruct
public void init() {
    webEventDAO = CommonDAOFactory.getInstance(dataSource).getWebEventDAO();
    search();
}

public void search() {
    DateTime start = new DateTime(2014, 1, 1, 0, 0 ,0);
    startDate = start.toDate();
    endDate = start.plus(Years.ONE.toPeriod()).minus(Seconds.ONE.toPeriod()).toDate();

    try {
        totalCount = webEventDAO.getSearchByPeriodRaceTypeAndRaceStatusForCompanyCount(Collections.singletonList(1), startDate, endDate, null, null);
        events = new ArrayList<Event>(totalCount);
        loadMore();
    } catch (DAOException e) {
        LOGGER.error("An error occurred while retrieving events.", e);
    }
}

public void loadMore() {
    List<Event> newEvents = new ArrayList<Event>(CHUNK_SIZE);
    try {
        newEvents = webEventDAO.searchByPeriodRaceTypeAndRaceStatusForCompany(Collections.singletonList(1), startDate, endDate, null, null, true, events.size(), CHUNK_SIZE);
        events.addAll(newEvents);
    } catch (DAOException e) {
        LOGGER.error("An error occurred while retrieving events.", e);
    }

}

public void initViewEventDetails(Integer index, Event event){
    LOGGER.info("index=" + index + " eventname=" + event.getName());
}

public String getDataSource() {
    return dataSource;
}

public void setDataSource(String dataSource) {
    this.dataSource = dataSource;
}

public List<Event> getEvents() {
    return events;
}

public void setEvents(List<Event> events) {
    this.events = events;
}

public Integer getTotalCount() {
    return totalCount;
}

public void setTotalCount(Integer totalCount) {
    this.totalCount = totalCount;
}}

bean , loadMore() 10 .

, loadMore() , 10 .

, , commandLink bean .

0

http://www.theserverside.com/news/thread.tss?thread_id=44186

ManagedBeans , CommandLinks DataTables. DataTables. JSF CommandLinks . CommandLink DataTable, e. g., , CommandLink, . , ManagedBeans . , CommandLink, , . , DataTable CommandLink , CommandLink , . , CommandLink, ComandLinkRenderer . CommandLink, . , . DataTable , CommandLink.

@ViewScoped @SessionScope, . , , adicional , @ViewScopped

+1

PrimeFaces, rc ([name: 'paramName', value: someParamValue]). # {param ['paramName']} EL

0

All Articles