面板或c内的任何容器:如果是c的一部分:foreach无法正常工作

时间:2016-11-28 10:04:46

标签: jsf jsf-2 jsf-2.2 facelets

当一个面板或某个命名容器是c的一部分时:如果它位于c:foreach中。工作不正常,在第一次渲染期间,对象的映射不正确。

JSTL标签(foreach) - > JSTL标签(如果) - >容器(面板/子视图)。

XHTML:可

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:c="http://xmlns.jcp.org/jsp/jstl/core">
  <h:body>
    <h:head/>
    <h:form id="myForm">
      <c:forEach items="#{jstlViwBean.list}" var="node">
        <c:if test="#{node ne 'two' or jstlViwBean.flag}" >
          <h:panelGroup layout="block" style="display: block">
            <h:outputText value="#{node}" />
          </h:panelGroup>
        </c:if>
      </c:forEach>
      <p:commandButton process="@this" value="toggle" update="myForm">
        <f:setPropertyActionListener target="#{jstlViwBean.flag}" value="#{!jstlViwBean.flag}" />
      </p:commandButton>
      <p:commandButton process="@this" value="refresh" update=":myForm"/>
    </h:form>
  </h:body>
</html>

查看bean:

@Named
@ViewScoped
public class JstlViwBean implements Serializable{
  private static final long serialVersionUID = 1L;

  private boolean flag;
  private List<String> list;

  @PostConstruct
  private void init(){
    list = new ArrayList<>();

    list.add("one");
    list.add("two");
    list.add("three");
  }

  public List<String> getList() {
    return list;
  }
  public boolean isFlag() {
    return flag;
  }
  public void setFlag(boolean flag) {
    this.flag = flag;
  }
}

在这个简单的例子中,当标志为真时,我正在添加一个包含两个的面板。切换按钮将切换标志并刷新页面。 当第一次按下切换时,它会给出

“一 三 三“

而不是 “一 二 三“

但是下一次刷新会让它恢复正常。

任何人都可以帮助我了解这里发生的事情吗?

0 个答案:

没有答案