JSF PrimeFaces inputText wewnątrz dataTable

JSF-2.0, Mojarra 2.1.19, PrimeFaces 3.4.1

Podsumowanie problemu: Miećp:inputText wewnątrzp:dataTable i akcja inputText wystrzelona przezp:remoteCommand który przekazuje indeks wiersza dataTable jako parametr za pomocąf:setPropertyActionListener. Ale zawsze przekazuje ostatni wiersz tabeli dataTable, a nie indeks wiersza, który zawiera aktualnie klikniętyp:inputText.

Jak widać z moich poprzednich pytań, próbuję użyćp:inputText jako komentator statusu na Facebooku lub itp. Wdrożenie obejmuje:p:dataTable. Jego wiersze reprezentują każdy status. Wygląda na to, że:

<p:dataTable id="dataTable" value="#{statusBean.statusList}" var="status"
                     rowIndexVar="indexStatusList">
    <p:column>
        <p:panel id="statusRepeatPanel">
            <p:remoteCommand name="test" action="#{statusBean.insertComment}"
                update="statusRepeatPanel">
                <f:setPropertyActionListener 
                    target="#{statusBean.indexStatusList}"
                    value="#{indexStatusList}">
                </f:setPropertyActionListener>
            </p:remoteCommand>
            <p:inputText id="commentInput" value="#{statusBean.newComment}"
                onkeypress="if (event.keyCode == 13) { test(); return false; }">
            </p:inputText>
        </p:panel>
    </p:column>
</p:dataTable>

Górny kod mówi, gdy naciśnięto klawisz Enter, ogieńp:remoteCommand który wywołuje metodę insert zarządzanego komponentu bean.

@ManagedBean
@ViewScoped
public class StatusBean {
    List<Status> statusList = new ArrayList<Status>();
    public int indexStatusList;
    public String newComment
    //getters and setters
    public void insertComment() {
        long statusID = findStatusID(statusList.get(indexStatusList));
        statusDao.insert(this.newComment,statusID)
    }

Razem debugujmy; zakładając, że sątrzy statusy pokazane wp:dataTable, kliknijp:inputText który wdruga status (indeks 1), wpisz „relax” i naciśnij klawisz Enter.

W konsoli debugowania poprawnie pokazuje „relaks”, ale znajduje niewłaściwy status, ponieważindexStatusList ma wartość 2, która należyostatni status wp:statusList. Musi to być 1, który jest indeksemp:inputText który kliknął w wierszu dataTable.

Myślę, że problem dotyczyp:remoteCommand który pobiera ostatni indeks na ekranie.

Jak to działa?

Wyobraźmy sobie, że jestp:commandLink zamiastp:remoteCommand ip:inputText:

<p:commandLink action=#{statusBean.insertComment>
      <f:setPropertyActionListener target="#{statusBean.indexStatusList}"
          value="#{indexStatusList}"></f:setPropertyActionListener>

Ten komponent pomyślnie przeszedłindexStatusList jako aktualnie kliknięty.

questionAnswers(1)

yourAnswerToTheQuestion