Salesforce 提供了一个 可用于开发 Visualforce 页面的标准预构建组件库,例如 和 。在 此外,您可以构建自己的自定义组件来扩充此库。本章概述了自定义组件和 如何创建它们:
<apex:relatedList><apex:dataTable>
- 什么是自定义组件?
- 自定义组件标记
- 在 Visualforce 页面中使用自定义组件
- 自定义组件属性
- 自定义组件控制器
- 定义自定义组件
什么是自定义组件?
类似于封装一件作品的方式 代码,然后在 程序中,您可以将通用设计模式封装在自定义组件中 ,然后在一个或多个 Visualforce 页面中多次重复使用该组件。
例如,假设您要使用 Visualforce 页面。相册中的每张照片都有自己的边框颜色和文本 显示在其下方的标题。而不是重复 Visualforce 标记 需要 要显示相册中的每张照片,您可以定义自定义组件 named 具有 image、边框颜色和标题,然后使用这些属性来显示 页面上的图像。定义后,组织中的每个 Visualforce 页面都可以 利用 与页面可以利用标准组件(如 或 )的方式相同。singlePhotosinglePhoto<apex:dataTable><apex:relatedList>与页面模板不同,页面模板也使开发人员能够重用 标记、自定义组件提供了更强大的功能和灵活性,因为:
- 自定义组件允许开发人员定义可传递到 每个组件。然后,属性的值可以更改标记的方式 显示在最后一页上,以及执行的基于控制器的逻辑 该组件的实例。此行为与模板的行为不同, 无法从使用 模板添加到模板的定义本身。
- 自定义组件描述显示在应用程序的组件中 参考对话框以及标准组件描述。模板 另一方面,描述只能通过“设置”区域引用 Salesforce,因为他们是 定义为页面。
定义自定义组件
要定义用于 Visualforce 页面的自定义组件,请执行以下操作:
- 在 Salesforce 的“设置”中,输入“快速” “查找”框,然后选择“Visualforce 组件”。Components
- 单击“新建”。
- 在“标签”文本框中,输入应用于 在设置工具中识别自定义组件。
- 在“名称”文本框中,输入应标识此名称的文本 Visualforce 标记中的自定义组件。此名称只能包含下划线和 字母数字字符,并且在您的组织中必须是唯一的。它必须以字母开头,而不是 包含空格,不以下划线结尾,不包含两个连续 强调。
- 在“说明”文本框中,输入自定义项的文本说明 元件。此描述与其他标准一起出现在组件参考中 单击“保存”后立即查看组件描述。
- 在正文文本框中,输入自定义的 Visualforce 标记 组件定义。单个组件最多可以容纳 1 MB 的文本,或者大约可以容纳 1,000,000 个字符。
- 单击“版本设置”以指定 Visualforce 的版本,然后 与此组件一起使用的 API。您还可以为任何托管软件包指定版本 安装在您的组织中。
- 单击“保存”以保存更改并查看自定义 组件的详细信息屏幕,或单击“快速保存”以保存 更改并继续编辑组件。您的 Visualforce 标记必须在 您可以保存组件。
注意
您还可以通过添加对自定义组件的引用,在 Visualforce 开发模式下创建自定义组件 尚不存在的 Visualforce 页面标记。保存标记后,将显示一个快速修复链接,该链接显示 允许您创建新的组件定义(包括任何指定的 attributes) 基于您为组件提供的名称。
例如,如果您尚未定义 自定义组件命名并插入到现有页面标记中,单击“保存”后,快速修复允许 您可以定义一个新的自定义组件,该组件使用以下默认值命名 定义:myNewComponent<c:myNewComponent myNewAttribute=”foo”/>myNewComponent
<apex:component>
<apex:attribute name="myattribute" type="String" description="TODO: Describe me"/>
<!-- Begin Default Content REMOVE THIS -->
<h1>Congratulations</h1>
This is your new Component: mynewcomponent
<!-- End Default Content REMOVE THIS -->
</apex:component>
您可以修改此项 通过输入快速从设置中定义 “查找”框,然后选择“Visualforce 组件”,然后 ,然后单击 myNewComponent 自定义项旁边的编辑 元件。Components
创建组件后,您可以在 http:// yourSalesforceOrgURL/apexcomponent/nameOfNewComponent 中查看它。 其中用于访问您的 Salesforce 组织的 URL (例如,MyDomainName.my.salesforce.com) 和 value of 是自定义组件定义上“名称”字段的值。yourSalesforceOrgURLnameOfNewComponent
该组件的显示方式就好像它是 Visualforce 页面一样。 因此,如果组件依赖于属性或组件的内容 标记的正文,此 URL 可能会生成您意想不到的结果。查看更多 准确测试自定义组件,将其添加到 Visualforce 页面,然后查看该页面。
自定义组件标记
自定义组件的所有标记都在 一个标签。 此标记必须是自定义组件定义中的顶级标记。 例如:<apex:component>
<apex:component>
<b>
<apex:outputText value="This is my custom component."/>
</b>
</apex:component>
请注意,标记可以是 Visualforce 和 HTML 标记的组合,就像其他 Visualforce 页面一样。对于更复杂的示例,您可以使用自定义组件来 创建一个跨多个 Visualforce 页面使用的表单。创建一个新的自定义组件,并复制以下内容 法典:
recordDisplay
<apex:component>
<apex:attribute name="record" description="The type of record we are viewing."
type="Object" required="true"/>
<apex:pageBlock title="Viewing {!record}">
<apex:detail />
</apex:pageBlock>
</apex:component>
接下来,创建一个名为 法典:
displayRecords
<apex:page >
<c:recordDisplay record="Account" />
</apex:page>
为 此示例要正确呈现,您必须关联 Visualforce 页面 在 URL 中具有有效的客户记录。例如,如果是账户 ID,则 生成的 URL 应 是:
001D000000IRt53
https://Salesforce_instance/apex/displayRecords?id=001D000000IRt53
你 应该会看到一个页面,其中包含有关您作为 同上。现在,将代码替换为以下示例:
displayRecords
<apex:page>
<c:recordDisplay record="Contact" />
</apex:page>
同样,在之前传入联系人的 ID 刷新页面。您应该会看到页面显示有关以下方面的信息 您的联系人。
自定义组件属性包含有关使用组件的更多信息。<apex:attribute>
在 Visualforce 页面中使用自定义组件
标记的正文是添加到标准 Visualforce 页面的标记,每当 组件包括在内。例如,以下 Visualforce 页面使用该组件 在自定义组件标记中定义(在此示例中,组件使用名称保存):<apex:component>myComponent
<apex:page standardController="Account">
This is my <i>page</i>. <br/>
<c:myComponent/>
</apex:page>
This is my page.
This is my custom component.
要在 Visualforce 页面中使用自定义组件,您必须在 组件的名称,其中包含定义组件的命名空间。例如,如果 命名的组件在 命名空间调用,组件可以 在 Visualforce 页面中引用为 .myComponentmyNS<myNS:myComponent>
为了便于使用,在 命名空间作为关联页面也可以使用命名空间前缀。因此,如果定义了上述示例中的页面和组件 在同一命名空间中,可以将组件引用为 。c<c:myComponent>
如果要将内容插入到自定义组件中,请使用 <apex:componentBody> 标记。
与标准组件类似,当更新或编辑自定义组件时, 引用它的 Visualforce 页面也会更新。
管理自定义组件的版本设置
设置 Visualforce 的 Salesforce API 和 Visualforce 版本 页面或自定义组件:
- 编辑 Visualforce 页面或组件,然后单击版本设置。注意您只能修改 “版本设置”中页面或自定义组件的版本设置 选项卡,在“设置”中编辑页面或组件时。
- 选择 Salesforce API 的版本。这也是 与页面或组件一起使用的 Visualforce 版本。
- 点击保存。
自定义组件属性
除了标准的 Visualforce 标记外,正文 标签还可以指定 在 Visualforce 页面中使用自定义组件时可以传递到自定义组件的属性。的价值观 然后,可以直接在组件中使用此类属性,也可以在组件的控制器中使用(如果适用)。但是,它们不能被使用 在组件控制器的构造函数中。<apex:component>
属性是用标签定义的。例如,以下 自定义组件定义指定了两个必需的属性,分别名为 和 。这些属性的值在自定义中引用 使用标准 Visualforce 表达式语言的组件定义 语法:<apex:attribute>valuetextColor{! }
<apex:component>
<!-- Attribute Definitions -->
<apex:attribute name="myValue" description="This is the value for the component."
type="String" required="true"/>
<apex:attribute name="textColor" description="This is color for the text."
type="String" required="true"/>
<!-- Component Definition -->
<h1 style="color:{!textColor};">
<apex:outputText value="{!myValue}"/>
</h1>
</apex:component>
在 Visualforce 页面中使用此组件,并使用 以下标记:
<c:myComponent myValue="My value" textColor="red"/>
标签需要以下值 、 和 属性:
<apex:attribute>namedescriptiontype
- 该属性定义了 自定义属性可以在 Visualforce 页面中引用。名称必须是唯一的 跨组件,并且不区分大小写。例如,如果两个属性是 named 和 ,包对它们的处理方式相同, 可能会导致意外行为。name“Model”“model”
- 该属性定义了 在组件参考库中出现一次的属性的帮助文本 自定义组件已保存。自定义组件列在 参考库,其中包含可用的标准组件。description
- 该属性定义 Apex 属性的数据类型。仅允许以下数据类型作为值 对于属性:typetype
- 基元,例如 String、Integer 或 Boolean。
- sObject,例如 Account、My_Custom_Object__c 或泛型 sObject 类型。
- 使用数组表示法指定的一维列表,例如 String[], 或联系人[]。
- 映射,使用 指定。您无需指定地图的 特定数据类型。type=”map”
- 自定义 Apex 类。
有关其他属性的信息,请参阅 apex:attribute。<apex:attribute>
默认自定义组件 属性
始终为自定义组件生成两个属性。这些属性 不需要包含在组件定义中:id允许自定义组件被其他组件引用的标识符 组件。如果未指定,则唯一标识符为 自动生成。rendered一个 Boolean 值,该值指定是否呈现自定义组件 在页面上。如果未指定,则此值默认为 true。
自定义组件控制器
与标准 Visualforce 页面类似,自定义组件可以 与用 Apex 编写的控制器相关联。此关联是通过将组件上的属性设置为 自定义控制器。您可以使用控制器执行其他逻辑,然后再返回 组件的标记到关联页面。controller
访问控制器中的自定义组件属性
若要访问关联的自定义组件控制器中自定义组件属性的值,请执行以下操作:
- 在自定义组件控制器中定义一个属性,以存储 属性。
- 定义属性的 getter 和 setter 方法。为 例:
public class myComponentController { public String controllerValue; public void setControllerValue (String s) { controllerValue = s.toUpperCase(); } public String getControllerValue() { return controllerValue; } }
通知 setter 修改值。 - 在标签中 组件定义,使用该属性将该属性绑定到您刚刚定义的类变量。为 例:<apex:attribute>assignTo
<apex:component controller="myComponentController"> <apex:attribute name="componentValue" description="Attribute on the component." type="String" required="required" assignTo="{!controllerValue}"/> <apex:pageBlock title="My Custom Component"> <p> <code>componentValue</code> is "{!componentValue}" <br/> <code>controllerValue</code> is "{!controllerValue}" </p> </apex:pageBlock> Notice that the controllerValue has been upper cased using an Apex method. </apex:component>
注意 当使用属性时,getter 必须定义 setter 方法或具有 和 值的属性。assignTogetset - 将组件添加到页面。例如
<apex:page> <c:simpleComponent componentValue="Hi there, {!$User.FirstName}"/> </apex:page>
页面的输出将如下所示:
请注意,Apex 控制器方法已更改,因此它以大写形式显示 字符。
controllerValue