JSF无法在自定义panelOutput布局中显示可变长度单选按钮

时间:2015-02-27 13:43:20

标签: jsf jsf-2 primefaces

JavaServer Faces的新手(以及Stack Overflow!)所以我希望我能正确地描述这个问题。

在这个例子中,我使用PrimeFaces进行自定义布局。

这是我正在开发的基本调查应用程序。我试图在页面上显示一组可变长度的单选按钮。麻烦的是,当我遍历选择项时,FOR属性似乎没有正确评估。

当页面使用ui:repeat迭代数据时会发生此问题。我也在dataList和dataTable中尝试了这个并且具有相同的效果。

此代码有效:

<ui:repeat value="#{surveyMB.groupHelper}" var="vargroup">
  <primefaces:outputPanel id="customPanel" style="margin-bottom:10px">
    <primefaces:panelGrid>

      <ui:repeat value="#{vargroup.questionArray}" var="varquestion">

        <primefaces:selectOneRadio styleClass="selectOneRadio" id="customRadio" value="#{varquestion.selectionId}" layout="custom">
          <f:selectItems value="#{vargroup.selectionMap}" id="selectItems2"></f:selectItems>
        </primefaces:selectOneRadio>

        <primefaces:row>

          <primefaces:column>
            <primefaces:radioButton id="opt1" for="customRadio" itemIndex="0" />
          </primefaces:column>

          <primefaces:column>
            <primefaces:radioButton id="opt2" for="customRadio" itemIndex="1" />
          </primefaces:column>

          <primefaces:column>
            <primefaces:radioButton id="opt3" for="customRadio" itemIndex="2" />                        
          </primefaces:column>

          <primefaces:column>
            <primefaces:radioButton id="opt4" for="customRadio" itemIndex="3" />                        
          </primefaces:column>

          <primefaces:column>
            <primefaces:radioButton id="opt5" for="customRadio" itemIndex="4" />                    
          </primefaces:column>
        </primefaces:row>

      </ui:repeat>
    </primefaces:panelGrid>
  </primefaces:outputPanel>         
</ui:repeat>

此代码不会:

<ui:repeat value="#{surveyMB.groupHelper}" var="vargroup">
  <primefaces:outputPanel id="customPanel" style="margin-bottom:10px">
    <primefaces:panelGrid>

      <ui:repeat value="#{vargroup.questionArray}" var="varquestion">

        <primefaces:selectOneRadio styleClass="selectOneRadio" id="customRadio" value="#{varquestion.selectionId}" layout="custom">
          <f:selectItems value="#{vargroup.selectionMap}" id="selectItems2"></f:selectItems>
        </primefaces:selectOneRadio>

        <primefaces:row>

        <ui:repeat var="item" value="#{vargroup.selectionItems}" varStatus="status">
          <primefaces:column>
            <primefaces:radioButton id="opt" for="customRadio" itemIndex="#{status.index}" />
          </primefaces:column>
        </ui:repeat>

        </primefaces:row>

      </ui:repeat>
    </primefaces:panelGrid>
  </primefaces:outputPanel>         
</ui:repeat>

当页面遍历两个ui:repeat标记时,会针对每个问题更新customRadio id。在第一个示例中,静态单选按钮的FOR属性正确更新并引用唯一的customRadio id。在第二个示例中,FOR属性似乎没有正确评估并抛出以下异常:

错误500:javax.servlet.ServletException:找不到带表达式的组件&#34; customRadio&#34;引自&#34; form1:j_id373995743_164ab843:2:j_id373995743_164ab90b:0:j_id373995743_164aba20:0:opt&#34;

由于每个问题可以有不同长度的响应和不同的答案,我希望能够动态显示它们,而不必为每种可能性硬编码静态响应。是否有解决方案可以正常显示,或者可能是任何人都可以建议以不同方式执行此操作的过程?

(注意:我在重复中构建radioButton的方式可能还有其他问题,但主要错误是我最关心的错误)

更新:我的目标是在多个列中跨越标题行(最终水平和垂直)执行响应选项。 See this article。没有(希望)必须构建自定义ui组件。我知道那可能在做梦!

但主要目标是单选按钮长度可变。一组答案可能有五个答案,另一组可能只有三个答案。但每组都有相同的数字,所以我不会混淆这些表格。

如果没有某种方法来覆盖或强制对嵌套for属性进行前置操作,我能想到的唯一方法是破解我在辅助bean中的帮助程序类,将每个单选按钮项显示为一个唯一的字段,这样我就不会#39; t必须遍历选项。

0 个答案:

没有答案