首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Magic ui:重复变量

Magic ui:重复变量
EN

Stack Overflow用户
提问于 2013-01-18 20:27:15
回答 2查看 787关注 0票数 4

我偶然发现了一个意想不到的行为,至少对我来说是这样。在使用ui时:repeat,我似乎可以从外部访问var。

代码页:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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中。这怎麽可能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-18 21:12:34

这是Mojarra中的一个bug。它的UIRepeat组件在恢复视图阶段的迭代结束时会忘记从请求范围中删除迭代变量。例如,在MyFaces中它不是这样工作的。

您的业务代码不应该依赖于它。请注意,<h:dataTable>没有这个问题,它在((UIData) component).setRowIndex(-1) in encodeEnd() method迭代结束时将迭代变量从请求范围中适当地删除。

票数 7
EN

Stack Overflow用户

发布于 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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14398960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档