commandLink в таблице данных Primefaces не работает, если я добавляю атрибут filteredValue

У меня есть таблица данных с <p:commandLink> в каждой строке. Пользователь щелкает ее, чтобы увидеть другую страницу с подробной информацией о выбранной записи. Он работал нормально, пока я не добавил filteredValue в свою таблицу данных. Мне нужен этот атрибут (filteredValue), чтобы правильно фильтровать и сортировать мою таблицу данных, как показано в этот вопрос.

Но после добавления этого атрибута мой commandLink перестает работать. Как я могу заставить его работать с атрибутом?

Вот мои данные:

<p:dataTable var="prot" value="#{myBean.listaProtocolos}" rows="15" filteredValue="#{myBean.listaProtocolosFiltrados}" sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}" sortOrder="descending" paginator="true" style="font-size: 0.9em;" paginatorPosition="bottom">
  <p:column filterBy="${prot.nrProtocolo}" filterMatchMode="contains" width="8%" style="text-align:center">
    <f:facet name="header">ID</f:facet>
    <p:commandLink action="#{myBean.verDetalhesProtocolo}" process="@this messages" update="@this messages">
      <h:outputText value="#{prot.nrProtocolo}" style="text-decoration: underline;"/>
      <f:setPropertyActionListener target="#{myBean.nrProtocolo}" value="#{prot.nrProtocolo}" />
    </p:commandLink>
  </p:column>
(etc)

и соответствующие части myBean:

public void verDetalhesProtocolo() {
    for(ProtocoloMY pro : this.listaProtocolos){
        if(pro.getNrProtocolo().trim().equalsIgnoreCase(this.nrProtocolo.trim())) {
            this.protocolo = new ProtocoloMY(pro);
            break;
        }
    }
    FacesContext facesContext = FacesContext.getCurrentInstance();
    facesContext.getExternalContext().redirect("detalhes_protocolo_processo.xhtml");
    //(This method isn't even called when I add the attribute filteredValue to my datatable)

public String getNrProtocolo() {
    return nrProtocolo;
}

public void setNrProtocolo(String nrProtocolo) {
    this.nrProtocolo = nrProtocolo;
}
    public List<ProtocoloMY> getListaProtocolos() {
    return listaProtocolos;
}

public List<ProtocoloMY> getListaProtocolosFiltrados() {
    return listaProtocolosFiltrados;
}

public void setListaProtocolosFiltrados(List<ProtocoloMY> listaProtocolosFiltrados) {
    this.listaProtocolosFiltrados = listaProtocolosFiltrados;
}

public void setListaProtocolos(List<ProtocoloMY> listaProtocolos) {
    this.listaProtocolos = listaProtocolos;
}

И я чуть не забыл сказать: когда я нажимаю на ссылку, происходит некоторый сетевой трафик, но в моей серверной консоли ничего не отображается, и метод в моем bean-компоненте не вызывается. консоль браузера, указывающая, что некоторые данные были отправлены в серверную часть

Я запускаю Primefaces v6.0.


person Bruno Lamps    schedule 13.07.2018    source источник


Ответы (1)


Чтобы PrimeFaces мог отслеживать, какая строка по ее уникальному идентификатору, вам нужно добавить атрибут rowKey="#{row.id}" к вашему p:datatable, используя любое значение в вашей строке POJO, которое делает ее уникальной.

person Melloware    schedule 13.07.2018
comment
Я пробовал использовать как Object (prot), так и String в качестве параметров, но это не сработало =(. Происходит то же самое. ‹p:commandLink action=#{myBean.verDetalhesProtocolo(prot.nrProtocolo)} process=@this messages update=@this messages› ‹h:outputText value=#{prot.nrProtocolo} style=text-decoration: underline;/› ‹/p:commandLink› - person Bruno Lamps; 13.07.2018
comment
Я заметил, что вам также не хватает атрибута rowKey= в таблице данных, который должен быть похож на rowKey=#{prot.id} или любое другое поле, которое делает строку идентифицируемой и уникальной. - person Melloware; 13.07.2018
comment
Я буду тестировать и как можно скорее! К сожалению, код застрял в офисе моей компании, так что это произойдет в следующий понедельник :) - person Bruno Lamps; 13.07.2018
comment
Привет @melloware, еще раз спасибо и извините, что так долго. Добавление атрибута rowkey в мою таблицу данных кажется правильным ответом! Должен ли я отметить этот ответ как правильный или есть способ преобразовать этот комментарий в ответ? - person Bruno Lamps; 16.07.2018
comment
@BrunoLamps Я исправил свой ответ, и да, вы должны отметить его как решение. Спасибо! - person Melloware; 16.07.2018