JSF 2 dataTable没有dataModel的行索引

12

我一直在使用ui:repeat来生成表格。通过使用varStatus,可以很容易地为行编号。当调用支持列表导航的后端bean时,例如向上或向下移动项目,我依赖于从varStatus中获取的行ID。

现在我想创建一个组合组件,该组件构建一个可定制的表格,并具有标记行、将行上/下移等所需的所有功能。为此,ui:repeat无法使用,因为我找不到处理不同列数的方式;我需要在一个地方指定标题,在另一个地方指定正文(而且我还没有掌握创建自定义组件的知识点)。因此,我换成了datatable,因为使用它意味着在与主体内容相同的位置指定标头作为facets。

这样做效果很好,直到我注意到由于某种原因没有varStatus。我已经投入了很多精力来处理列表显示,而不需要任何datamodel,我不想开始使用它。有没有办法可以获取当前行号,就像在表格中显示的那样,而不使用datamodel

此外,我正在使用viewScope,如果我理解正确,这意味着不能将dataTable绑定到bean上。

1个回答

32

只需将表格绑定到视图本身,而不是绑定到一个bean。

<h:dataTable binding="#{table}" ...>

你可以在必要时使用#{table.rowIndex}。例如:

然后你可以在必要时使用#{table.rowIndex}。例如:

<h:column>#{table.rowIndex + 1}</h:column>

请注意,代码是原样的,EL变量名table完全由您选择。

另请参阅:


1
我看了另一篇帖子,你在那里提供了这个解决方案,虽然我以为binding="#{table}"是绑定到bean的缩写。我不知道这是可能的。谢谢BalusC! - nivis
我和 @nivis 的想法完全一致。也许是因为 var 属性的值不需要 EL 表达式,但 binding 属性的值需要。我曾经有这样的偏见,认为 EL 表达式中的任何命名值都应该已经被声明(由我自己),而且我觉得给变量(例如 tablerowItem)命名不应该在 EL 表达式中发生。 - Hirofumi Okino
1
@Palo:代码原样不变。当然<h:column>标签必须放在<h:dataTable>标签内部。您可以使用任何不存在的变量名,例如#{foo}。还可以参见 https://dev59.com/PGUp5IYBdhLWcg3w-LQJ - BalusC
它不适用于Mojarra 2.1.7。表格不再显示。相反,您必须使用“魔法词”table,而无需使用binding - Marco Sulla
@Marco:如果您将变量存储在请求范围之外的作用域中,并因此在所有其他与同一bean相关联的视图/状态中错误地重复使用相同的组件,则确实会失败(组件是请求范围的,从未设计为线程安全,因为这太昂贵/低效)。请参见更新答案中的“另请参阅”链接。 - BalusC
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接