我偶然发现了一个意想不到的行为,至少对我来说是这样。在使用ui时:repeat,我似乎可以从外部访问var。
代码页:
<f:metadata>
<f:event type="preRenderView" listener="#{xTest.init()}" />
</f:metadata>
<h:form id="xTestForm">
<h:panelGroup layout="block">
Track: #{trk.name}
</h:panelGroup>
<table>
<ui:repeat
value="#{xTest.trackList}"
var="trk">
<tr>
<td>#{trk.name}</td>
<td>
<p:commandLink
actionListener="#{xTest.setTrack(track)}"
value="test"
update=":xTestForm" />
</td>
</tr>
</ui:repeat>
</table>
</h:form>代码- Bean
package beans;
import dao.DAOFactory;
import dao.track.TrackDAO;
import dto.Track;
import exceptions.DAOException;
import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.MessageUtil;
@ManagedBean
@ViewScoped
public class xTest implements Serializable {
private DAOFactory daoFactory = Config.getInstance().getDAOFactory();
private TrackDAO trackDAO;
private Track track = new Track();
private MessageUtil msg = new MessageUtil();
private List<Track> trackList = new ArrayList();
public xTest() {
trackDAO = daoFactory.getTrackDAO(true);
}
public void init() {
if (!FacesContext.getCurrentInstance().isPostback()) {
try {
trackList = trackDAO.listByAlbumid(241);
} catch (SQLException | DAOException ex) {
msg.setErrorMessage(ex);
}
}
}
public List<Track> getTrackList() {
return trackList;
}
public void setTrack(Track track) {
this.track = track;
}
}如果我单击曲目列表中的链接,曲目名称将显示在panelGroup中。这怎麽可能?
发布于 2013-01-18 21:12:34
这是Mojarra中的一个bug。它的UIRepeat组件在恢复视图阶段的迭代结束时会忘记从请求范围中删除迭代变量。例如,在MyFaces中它不是这样工作的。
您的业务代码不应该依赖于它。请注意,<h:dataTable>没有这个问题,它在((UIData) component).setRowIndex(-1) in encodeEnd() method迭代结束时将迭代变量从请求范围中适当地删除。
发布于 2021-02-10 02:09:17
8年后,有人向PrimeFaces报告了这个问题,所以我打开了一个Mojarra问题和一个公关来解决这个问题。
Mojarra问题:https://github.com/eclipse-ee4j/mojarra/issues/4830
Mojarra PR:https://github.com/eclipse-ee4j/mojarra/pull/4831
https://stackoverflow.com/questions/14398960
复制相似问题