【问题标题】:Conditionally rendering a row in a <h:datatable>有条件地呈现 <h:datatable> 中的一行
【发布时间】:2014-02-28 16:41:09
【问题描述】:

我正在尝试更改现有数据表(由以前的开发人员编写),以便在以系统管理员身份登录时可以看到整个表,但如果以其他人身份登录,则只能看到您自己的详细信息。

我已经尝试通过将rendered 标记添加到表中的每个值来执行此操作。这让我看到我的检查工作正常,并让基本测试正常工作。这部分代码按预期运行。但是,有一个明显的缺陷是,无论是否填满,仍然会生成额外的行。

这是我的代码:

<h:dataTable value="#{userBean.users}" var="userAccount"
                binding="#{userBean.userTable}"
                styleClass="defaultTable"
                headerClass="tableHeader"
                rowClasses="evenRow,oddRow"
                columnClasses="col512">

    <h:column>
        <f:facet name="header">
            <h:outputText value="Username"/>
        </f:facet>
        <h:commandLink value="#{userAccount.userName}"
                       action="#{userBean.edit}"
                       rendered="#{(userAccount.userName == settings.user.userName) 
                                       || settings.user.systemAdministrator}"/>
    </h:column>

    <h:column>
        <f:facet name="header">
            <h:outputText value="User Group"/>
        </f:facet>
        <h:outputText id="userGroup" value="#{userAccount.userGroup.userGroupName}"
                      rendered="#{(userAccount.userName == settings.user.userName)
                                       || settings.user.systemAdministrator}"/>
    </h:column>
</h:dataTable>

当不是 systemAdministrator 时,它(可预测地)输出如下内容:

生成所有行,但只为当前用户填写。

我理解它为什么这样做,但我不确定如何让它做我想让它做的事情。这就像我想render/not render 整行但是数据表是由列而不是行生成的,所以我看不到如何添加它。即使添加&lt;c:if&gt;,我也需要在行周围添加它,所以当它按列生成时,我不知道该怎么做。

我的另一个想法是我可以检查该行是否为空,如果是则隐藏它?但这对我来说有点肮脏。

这些选项中哪一个是最好的,我如何在没有row 标签的情况下绕过检查/隐藏行?还是我需要重组整个表格? (可能超出我的能力范围。)


编辑:

@xild 建议的 showClass/hideClass rowClasses 如下所示:

即相同,但没有行之间的中断。

【问题讨论】:

  • 在支持 bean 中提供瞬态属性是一种选择吗?恕我直言,我会在 userBean 中创建一个 userVisibleAccounts 字段,其中仅包含当前用户可以访问的信息。

标签: html jsp jsf jsp-tags


【解决方案1】:

如果您不想看到该对象,请不要放入您的收藏中。

List<Users> usersAllowed= new ArrayList<Users>();
for (Users user : allUsers) {
    if(condition){
       usersAllowed.add(user); 
    }
}

并使用此列表显示在您的数据表中。

如果你不想这样,你也可以设置渲染为“h:column”。

    <h:column rendered="#{(userAccount.userName == settings.user.userName)
                                       || settings.user.systemAdministrator}">
    </h:column>

或者最后你可以使用 dataTable 的 rowClasses 参数。 如果您不想看到该行,请使用:

  rowClasses="#{((userAccount.userName == settings.user.userName)
                                   || settings.user.systemAdministrator)) ? 'showClass' : 'hideClass'}"

【讨论】:

  • &lt;h:column rendered&gt; 逐列呈现(因此,适用于 所有 行),而不是逐行呈现。然而,第一个和第三个建议都可以。
  • 同意&lt;h:column rendered&gt; 之一。我想你建议的最后一个替换现有的rowClasses?我试过了,它产生了相同的输出,但行之间没有线条(将编辑问题以包含另一个屏幕截图)。
  • 问号前是不是不必要的右括号?还是应该在左大括号之前有一个左括号?
猜你喜欢
  • 2018-03-11
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 2023-04-07
  • 2010-10-30
  • 2021-04-18
  • 2011-11-19
  • 2011-10-19
相关资源
最近更新 更多