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.