Salesforce VF:使用标准列表控制器
标准列表控制器简介
标准列表控制器允许您创建可以显示或作用于一组记录的Visualforce页面。
显示记录列表是几乎所有Web应用程序的基本行为。Visualforce使得仅使用标记而不使用后端代码来显示相同类型的记录列表变得非常容易。像往常一样,秘密是标准控制器,在这种情况下,是标准列表控制器。
标准列表控制器提供了许多强大的自动行为,例如查询特定对象的记录并使记录在集合变量中可用,以及对结果进行过滤和分页。将标准列表控制器添加到页面与添加标准(记录)控制器非常相似,但是其目的是一次处理多个记录,而不是一次处理一个记录。
显示记录列表
使用标准列表控制器和迭代组件,例如 <apex:pageBlockTable>,以显示记录列表。
使用标准(记录)控制器,可以很容易地将一条记录加载到可以在Visualforce页面上使用的变量中。标准列表控制器与之类似,不同之处在于它代替单个记录,而是将记录列表或集合加载 到变量中。
因为要处理的是集合,而不是单个记录,所以需要使用迭代组件来显示它们。迭代组件使用一组相似项,而不是单个值。迭代组件将遍历其集合,并针对每个记录,根据您作为组件标记的一部分提供的模板生成一些输出。这听起来很复杂,但是阅读标记后您会很快理解。
使用标准列表控制器的标记与使用标准一次记录一次的控制器几乎相同。为了清楚起见,在下面的示例中,主要区别以粗体突出显示。
- 打开开发者控制台,然后单击 File | New | Visualforce page 以创建新的Visualforce页面。输入 ContactList页面名称。
- 在编辑器中,将所有标记替换为以下标记。
<apex:page standardController="Contact" recordSetVar="contacts">
<apex:pageBlock title="Contacts List">
<!-- Contacts List -->
<apex:pageBlockTable value="{! contacts }" var="ct">
<apex:column value="{! ct.FirstName }"/>
<apex:column value="{! ct.LastName }"/>
<apex:column value="{! ct.Email }"/>
<apex:column value="{! ct.Account.Name }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
使用标准列表控制器与使用标准控制器非常相似。首先,您设置standardController 的属性 <apex:page> 组件,然后设置 recordSetVar同一组件上的属性。的standardController 属性设置要使用的对象,就像使用标准控制器一样。的 recordSetVar 设置要与记录集合一起创建的变量的名称,在这里, {!contacts}。按照约定,此变量通常命名为对象名称的复数形式。
<apex:pageBlockTable>是一个迭代组件,可生成具有平台样式的数据表。这是表标记中发生的事情。
- value 的属性 <apex:pageBlockTable> 设置为标准列表控制器加载的变量, {!contacts}。这是记录列表<apex:pageBlockTable> 将与。
- 对于该列表中的每条记录,一次只有一条记录, <apex:pageBlockTable> 将该记录分配给在中命名的变量 <apex:pageBlockTable>的 var 属性。在这种情况下,该变量名为ct。
- 对于每条记录, <apex:pageBlockTable> 使用一组定义的行在表中构造一个新行 apex:column 体内的成分 <apex:pageBlockTable>。的apex:column 组件依次使用 ct 代表当前记录的变量,以提取该记录的字段值。
- 在循环之外, <apex:pageBlockTable> 使用中的字段 <apex:column> 通过查找每个字段的标签来创建列标题的组件。
这要花很多钱,而且迭代组件很难一开始就理解。您现在可以做的最好的事情就是尝试创建自己的。选择要在表中显示的字段。查找以下各项的不同属性<apex:pageBlockTable> 和 apex:column,然后进行实验,直到您感到舒适为止。您也可以尝试使用其他一些迭代组件,例如<apex:dataList> 甚至 apex:repeat。
将列表视图过滤添加到列表
采用 {!listViewOptions}获取可用于对象的列表视图过滤器的列表。采用{!filterId} 设置列表视图过滤器以用于标准列表控制器的结果。
标准列表控制器提供了许多功能,可用于更改列表的显示。最强大的功能之一是列表视图过滤器。您可以通过单击而不是代码来声明性地创建列表视图过滤器,并且标准列表控制器允许您使用页面上任何已定义的列表视图过滤器。
- 包裹整个 <apex:pageBlock> 在一个 <apex:form> 标签。
要更改标准列表控制器的列表视图过滤器,您需要将新值提交回服务器。执行此提交的标准方法是使用通过 <apex:form> 零件。 - 在里面 <apex:pageBlock> 标签,添加以下属性。这给 <apex:pageBlock> 一个可以用于炫酷Ajax效果的“名称”,我们将在后面对此进行解释。
id="contacts_list"
- <apex:pageBlock> 标签,并在上方 <apex:pageBlockTable>,添加以下标记
<apex:page standardController="Contact" recordSetVar="contacts">
<apex:form>
<apex:pageBlock title="Contacts List" id="contacts_list">
Filter:
<apex:selectList value="{! filterId }" size="1">
<apex:selectOptions value="{! listViewOptions }"/>
<apex:actionSupport event="onchange" reRender="contacts_list"/>
</apex:selectList>
<!-- Contacts List -->
<apex:pageBlockTable value="{! contacts }" var="ct">
<apex:column value="{! ct.FirstName }"/>
<apex:column value="{! ct.LastName }"/>
<apex:column value="{! ct.Email }"/>
<apex:column value="{! ct.Account.Name }"/>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:form>
</apex:page>
从刚创建的“过滤器”菜单中进行新选择时,应该注意两点。首先,当您选择新的过滤器时,记录列表会更改。(您可能需要尝试几个不同的选项,在标准DE组织中使用示例数据时,某些列表视图将显示相同的记录。)
其次,更微妙的是,列表在更新时不会重新加载整个页面。这种“ Ajax”效果是由reRender =“ contacts_list” 的属性 <apex:actionSupport>零件。组件与reRender 是仅更新页面中以命名的部分 reRender 属性。由于您添加了id =“ contacts_list” 到 <apex:pageBlock>,当操作完成时,只有 <apex:pageBlock> 已更新-无需重新加载整个页面。
此页面上新功能的完整生命周期如下。
- 页面加载后, <apex:selectList> 通过从列表中获取列表,构建可用过滤器菜单 {!listViewOptions} 表达。 listViewOptions 是标准列表控制器提供的属性。
- 当您从菜单中选择新选项时, onchange 事件是由 <apex:actionSupport> 零件。
- 当。。。的时候 onchange 触发后,页面会将新项目提交到 filterId 属性,设置在 <apex:selectList>。
- 更新属性后,页面会从服务器获得新的响应,并在页面中添加新的匹配记录集合。 contacts 变量。
- 但是因为 <apex:actionSupport> 指定仅重新呈现页面的一部分,则使用Ajax(异步JavaScript)更新页面,而不是重新加载整个页面。
将分页添加到列表
使用标准列表控制器的分页功能,可以使用户一次查看一个“页面”的长记录列表。
到目前为止,您开发的功能非常好,并且可以与开发人员组织中作为示例数据提供的简短记录列表配合使用。但是,当您拥有一个拥有数百或数千甚至数百万条记录的真实组织时,会发生什么?在一页上查看全部内容效果不佳!
实际上,默认情况下,标准列表控制器仅显示与您的过滤条件相匹配的前20条记录(如果有)。您如何让人们访问的内容比前20条记录多,或者每页记录可能比20条更多?
答案是分页。这是标准的Web应用程序用户界面元素,通常使用“下一个”和“ 上一个” 链接,您可以一次浏览一长串“页面”的记录,从而前后移动 。您可以使用标准列表控制器将其添加到页面中,还可以使用诸如进度指示器和更改每页记录数的菜单之类的便利。
- 联系人列表下方 <apex:pageBlockTable>,添加以下标记。
<!-- Pagination -->
<table style="width: 100%"><tr>
<td>
<!-- Page X of Y -->
</td>
<td align="center">
<!-- Previous page -->
<!-- Next page -->
</td>
<td align="right">
<!-- Records per page -->
</td>
</tr></table>
这将创建一个HTML表,该表将包含要添加的三个分页控件。
在您的实际页面中,您可能会使用更多具有单独样式的语义标记,但是目前,纯HTML简洁明了,并且可以避免使用。
- 更换
带有以下标记的注释行
Page: <apex:outputText
value=" {!PageNumber} of {! CEILING(ResultSize / PageSize) }"/>
这会将进度指示器添加到列表中,以指示用户正在查看哪个页面以及还有多少页面。如果您在DE组织中尝试此操作,它可能会显示“第1页,共1页”。
- 更换 <!- Previous page -> 和 <!-Next page-> 带有以下标记的注释行。
<!-- Previous page -->
<!-- active -->
<apex:commandLink action="{! Previous }" value="« Previous"
rendered="{! HasPrevious }"/>
<!-- inactive (no earlier pages) -->
<apex:outputText style="color: #ccc;" value="« Previous"
rendered="{! NOT(HasPrevious) }"/>
<!-- Next page -->
<!-- active -->
<apex:commandLink action="{! Next }" value="Next »"
rendered="{! HasNext }"/>
<!-- inactive (no more pages) -->
<apex:outputText style="color: #ccc;" value="Next »"
rendered="{! NOT(HasNext) }"/>
该标记在页面上提供了上一个和 下一个链接。标记涵盖两种可能性:当在给定方向上有更多记录要查看时,则该链接处于活动状态;当在给定方向上没有更多页面时,该链接将被禁用。
- 更换 <!- Records per page -> 带有以下标记的注释行。
Records per page:
<apex:selectList value="{! PageSize }" size="1">
<apex:selectOption itemValue="5" itemLabel="5"/>
<apex:selectOption itemValue="20" itemLabel="20"/>
<apex:actionSupport event="onchange" reRender="contacts_list"/>
</apex:selectList>
该标记提供了用于更改每页记录数的菜单。在这里,我们仅添加了一个选项以在页面上显示较少的记录。从列表中选择“ 5”,然后查看列表以及其他控件。
在分页控件中, <apex:commmandLink> 组件引用标准列表控制器提供的两种操作方法, Previous 和 Next。结果是执行以下操作的链接 Previous 要么 Next 行动。
那这是什么 rendered 属性,例如 {!HasPrevious}?通过这种方式,Visualforce使您能够有条件地显示组件,即取决于布尔表达式的结果。这里的页面标记引用的是标准列表控制器提供的布尔属性,HasPrevious 和 HasNext,它可以让您知道在给定方向上是否还有更多记录。通过使用 rendered 属性,您可以在页面上显示或隐藏该组件的结果。第一次加载页面时,这就是 Previous 链接变灰的方式,但是如果您通过单击 Next 链接向前移动,该链接将变为活动状态 。
每页记录选择菜单使用 <apex:selectList>,您之前使用过,但是我们没有使用调用控制器方法来获取菜单值的方法,而只是使用 <apex:selectOption>所需值的元素。再次<apex:actionSupport> 标签会导致菜单在选定值更改时触发其操作,并再次使用 reRender =“ contacts_list” 仅更新 <apex:pageBlock>。这里的新部分是 <apex:selectList> 设置标准列表控制器的 PageSize 属性。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97627.html