[本文是预发行文档,可能会有所更改。]
Power Pages客户端 API 可帮助开发人员作 UI 组件、管理表单和列表、处理用户身份验证以及以编程方式与 Dataverse 记录交互。 当页面加载并且可以通过具有所选名称的全局变量访问客户端 API 时可用。
本文在整个示例中都使用变量名称 ,并建议遵循此命名约定保持一致性。
使用客户端 API,可以:
使用客户端 API,可以:
- 检索和修改窗体和窗体控件
- 显示或隐藏 UI 元素
- 使用 Web API 创建和检索记录
- 管理用户身份验证
- 使用多语言内容
重要
- 这是一项预览功能。
- 预览功能不适用于生产用途,并且可能具有受限功能。 这些功能受 补充使用条款的约束,在正式发布之前提供,以便客户能够提前访问并提供反馈。
客户端 API 初始化
当页面加载时, 客户端 API 不会立即初始化。 使用 函数将 API 对象 分配给变量。 可通过两种方式初始化客户端 API:
基于回调的 API 就绪情况
使用回调函数,将 API 对象分配给在准备就绪时定义的变量。 两个示例演示如何:
通过使用匿名函数:
Microsoft.Dynamic365.Portal.onPagesClientApiReady(($pages) => {
const forms = $pages.currentPage.forms.getAll();
console.log(`Found ${forms.length} forms on the page.`);
});
通过使用命名函数:
function start($pages){
const forms = $pages.currentPage.forms.getAll();
console.log(`Found ${forms.length} forms on the page.`);
}
Microsoft.Dynamic365.Portal.onPagesClientApiReady(start)
基于 Promise/await 的 API 就绪情况
使用 await 来处理函数为更简洁的异步流返回 的承诺。
let $pages = await Microsoft.Dynamic365.Portal.onPagesClientApiReady();
const forms = $pages.currentPage.forms.getAll();
console.log(`Found ${forms.length} forms on the page.`);
何时使用每个方法
下表描述了何时使用每个方法。
| 方法 | 何时使用 |
|---|---|
| 基于回调的 API 就绪情况 | 如果需要支持旧版浏览器或不支持 的旧脚本,或者想要注册在 API 准备就绪时运行的多个处理程序,请使用。 非常适合事件驱动的模式。 |
| 基于 Promise/await 的 API 就绪情况 | 在支持 更简洁有序代码的新式 JavaScript 环境中使用。 最好是逻辑取决于 API 在继续执行之前准备好的 API。 |
小窍门
如果代码库已使用 ,则首选基于 Promise 的方法来实现一致性。
$pages.currentPage.forms 集合
该 集合包含用于处理页面上的表单元素的方法。
$pages.currentPage.forms 方法
使用这些方法列出窗体并获取特定的窗体实例。
| 方法 | 退货 | Description |
|---|---|---|
getAll |
IForm[] |
返回添加到当前页的所有表单。 |
getFormById(id: string) |
IForm |
按其 HTML 元素 ID 检索窗体。 |
getFormByName(name: string) |
IForm |
按其名称检索窗体。 |
$pages.currentPage.forms 方法示例
这些示例演示如何获取所有窗体,并按 ID 或名称检索特定表单。
let forms = $pages.currentPage.forms.getAll();
let form1 = $pages.currentPage.forms.getFormById('form_#1');
let form2 = $pages.currentPage.forms.getFormByName('form_name')
IForm 接口
该 接口表示控件和选项卡的容器。
IForm 属性
以下属性描述窗体及其包含的控件和选项卡。
| 资产 | 类型 | Description |
|---|---|---|
id |
字符串 | 窗体的 ID。 |
name |
字符串 | 窗体的名称。 |
controls |
控制 | 窗体上的所有控件。 |
tabs |
标签 | 窗体上的所有选项卡。 |
isMultiStep |
布尔 | 如果窗体为多步骤,则为 True;否则为 false。 请参阅 Multistep 窗体。 |
IForm 方法
使用这些方法来查询窗体的可见性,并切换窗体是否可见。
| 方法 | 退货 | Description |
|---|---|---|
getVisible |
boolean |
如果窗体可见,则返回 true;否则为 false。 |
setVisible(isVisible: boolean) |
void |
设置窗体的可见性。 |
IForm 示例
以下示例按 ID 检索窗体,并记录其可见性、控件数和选项卡。
let form = $pages.currentPage.forms.getFormById('form_#1');
console.log(`Form id: ${form.id} has ${form.controls.length} controls.`);
if (form.getVisible()) {
console.log('Form is currently visible.');
}
let tabs = form.tabs;
console.log(`Form has ${tabs.length} tabs.`);
多步窗体
多步骤窗体是包含多个基本窗体的容器。
Multistep 窗体属性
以下属性适用于多步骤窗体容器,并描述当前活动步骤中可用的属性。
| 资产 | 类型 | Description |
|---|---|---|
id |
字符串 | 多步骤窗体的 ID。 |
controls |
控制 | 当前步骤中的所有控件。 |
tabs |
标签 | 当前步骤中的所有选项卡。 |
isMultiStep |
布尔 | 如果窗体为多步骤,则为 True;否则为 false。 |
nextButton |
JQuery 元素 | 表示下一个按钮(如果缺少空对象)。 |
previousButton |
JQuery 元素 | 表示上一个按钮(如果不存在,则为空对象)。 |
多步骤表单方法
使用这些方法来检查多步骤窗体中的步骤之间的可见性和移动。
| Name | 退货 | Description |
|---|---|---|
getVisible |
boolean |
如果窗体可见,则返回 true;否则为 false。 |
setVisible(isVisible: boolean) |
void |
设置窗体的可见性。 |
isVisible |
boolean |
指示窗体是应显示(true)还是隐藏(false)的属性。 |
hasNextStep |
boolean |
如果下一步存在,则返回 true;否则为 false。 |
hasPreviousStep |
boolean |
如果上一步存在,则返回 true;否则为 false。 |
goToNextStep |
void |
导航到下一步;如果不存在下一步,则提交表单。 |
goToPreviousStep |
void |
导航到上一步;如果不存在,则引发异常。 |
Multistep 表单示例
此示例演示如何检索多步骤窗体、检查它并前进到下一步。
let $pages = await Microsoft.Dynamic365.Portal.onPagesClientApiReady();
let form = $pages.currentPage.forms.getFormById('multiform_#1');
console.log(`Form id: ${form.id} has ${form.controls.length} controls.`);
if (form.getVisible()) {
console.log('Form is currently visible.');
}
let tabs = form.tabs;
console.log(`Form has ${tabs.length} tabs.`);
form.goToNextStep();
选项卡
一 个窗体中包含一个或多个节。
Tab 属性
选项卡中 各节 的数组。
Tab 方法
使用这些方法来检查选项卡的可见性、检索其名称,以及切换它是否可见。
| 方法 | 退货 | Description |
|---|---|---|
getVisible |
boolean |
如果选项卡可见,则返回 true;否则为 false。 |
getName |
string |
返回选项卡的名称。 |
setVisible(isVisible: boolean) |
void |
设置选项卡的可见性。 |
选项卡示例
此示例检索窗体、枚举其选项卡并记录第一个选项卡的名称。
let form = $pages.currentPage.forms.getFormById('form_#1');
let tabs = form.tabs;
console.log(`Form has ${tabs.length} tabs.`);
console.log(`First tab is named: ${tabs[0].getName()}`);
Section
分区组选项卡中的控件。
Section 属性
节中的 控件 数组。
节方法
使用这些方法来读取节的名称并控制其可见性。
| 方法 | 退货 | Description |
|---|---|---|
getVisible |
boolean |
如果节可见,则返回 true;否则为 false。 |
getName |
string |
返回节名称。 |
setVisible(isVisible: boolean) |
void |
设置节的可见性。 |
节示例
此示例从窗体的第一个选项卡中检索部分并记录基本详细信息。
let form = $pages.currentPage.forms.getFormById('form_#1');
let sections = form.tabs[0].sections;
console.log(`Tab has ${sections.length} section(s).`);
console.log(`First section is named: ${sections[0].getName()}`);
控件
控件表示单个窗体元素。
控制方法
使用这些方法来检索或更新控件的值、可见性和禁用状态。
| 方法 | 退货 | Description |
|---|---|---|
getDisabled |
boolean |
如果控件处于禁用状态,则返回 true。 |
getVisible |
boolean |
如果控件可见,则返回 true。 |
getName |
string |
返回控件的名称。 |
getValue |
string | undefined |
检索当前值。 |
setDisabled(isDisabled: boolean) |
void |
设置禁用状态。 |
setVisible(isVisible: boolean) |
void |
设置可见性。 |
setValue(value: string) |
void |
设置控件的新值。 |
控件示例
此示例提取窗体,检查第一个控件的可见性,然后隐藏它。
let form = $pages.currentPage.forms.getFormById('form_#1');
let controls = form.controls;
if (controls.length > 0) {
if (controls[0].getVisible()) {
console.log(`Control ${controls[0].getName()} is visible.`);
}
controls[0].setVisible(false); // Hide the first control.
}
支持的控件
所有控件都实现标准 控件方法。 某些控件提供了更多方法,并且具有与标准控制方法不同的实现详细信息。 了解不同类型的控件的其他方法和实现差异。
$pages.currentPage.lists 集合
列表集合提供用于处理页面上的传统和新式列表元素的方法。
$pages.currentPage.lists 方法
使用这些方法枚举页面上的所有列表,并通过其 HTML 元素 ID 获取特定列表。
| 方法 | 退货 | Description |
|---|---|---|
getAll |
IList | 返回当前页上的所有列表。 |
getListById(id: string) |
IList | 按其 HTML 元素 ID 获取列表。 |
$pages.currentPage.lists 示例
这些示例演示如何枚举页面上的所有列表,并通过其 HTML 元素 ID 获取特定列表。
let lists = $pages.currentPage.lists.getAll();
let list = $pages.currentPage.lists.getListById('list_#1');
IList 接口
列表表示表格或类似网格的数据组件。
IList 属性
这些属性标识列表并指示它是否使用新式呈现模型。
| 资产 | 类型 | Description |
|---|---|---|
id |
字符串 | 列表的唯一标识符。 |
isModern |
布尔 | 对于新式列表,为 true 的布尔值,否则为 false。 |
IList 方法
使用这些方法来检查列表可见性、切换是否可见以及访问基础 HTML 元素。
| 方法 | 退货 | Description |
|---|---|---|
getVisible |
boolean |
如果列表可见,则返回 true。 |
setVisible(isVisible: boolean) |
void |
设置列表的可见性。 |
getHtmlElement |
HTMLElement |
返回列表的基础 HTML 元素。 |
IList 示例
以下示例按 ID 检索列表并记录其可见性状态。
let list = $pages.currentPage.lists.getListById('list_#1');
console.log(`List id: ${list.id}`);
if (list.getVisible()) {
console.log('List is currently visible.');
}
$pages.user 对象
该 对象提供用于让用户登录或注销的方法。
$pages.user 方法
这些方法不返回任何值。
| 方法 | Description |
|---|---|
signIn |
将用户重定向到登录页。 |
signOut |
注销当前登录的用户。 |
$pages.webAPI 对象
该 对象提供从数据源创建和检索记录的方法。
createRecord 方法
在指定的表中创建新记录。
语法:
返回:解析为创建的记录或作结果的 Promise 。
createRecord 方法参数
提供表示要创建的记录的目标表和数据对象。
| 参数 | 类型 | Description |
|---|---|---|
entitySetName |
字符串 | 实体集的名称。 了解 Dataverse Web API 中的实体集名称 |
data |
对象 | 要创建的记录数据。 |
createRecord 方法示例
此示例演示如何使用实体集名称和最小数据对象进行调用 。
$pages.webAPI.createRecord('contacts', {
firstName: 'User',
lastName: 'Test'
});
retrieveRecord 方法
按记录的唯一标识符检索记录。
语法:
返回:解析为记录对象的 Promise 。
retrieveRecord 方法参数
指定表、记录 ID 和可选的 OData 查询选项以调整响应。
| 参数 | 类型 | Description |
|---|---|---|
entitySetName |
字符串 | 实体集的名称。 了解 Dataverse Web API 中的实体集名称。 |
id |
字符串 | 记录的唯一标识符。 |
options |
string (可选) | 可选的 OData 查询字符串,用于限制返回的数据。 |
注释
虽然参数 是可选的,但为了获得最佳性能,始终会限制使用 选项返回的列值数。
retrieveRecord 方法示例
此示例按 ID 检索单个记录,并使用 OData 查询选项限制返回的列。
let record = await $pages.webAPI.retrieveRecord('accounts', 'aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb', '$select=name');
retrieveMultipleRecords 方法
基于提供的查询选项检索多个记录。
语法:
返回:解析为记录对象的数组 的 Promise 。
retrieveMultipleRecords 方法参数
指定表和可选的 OData 查询以筛选结果并限制返回的列。
| 参数 | 类型 | Description |
|---|---|---|
entitySetName |
字符串 | 实体集的名称。 |
options |
string (可选) | 用于控制返回数据的 OData 查询选项字符串。 详细了解 Dataverse Web API 支持的 OData 查询选项 |
注释
虽然参数 是可选的,但为了获得最佳性能,始终会限制使用 选项返回的列值数。
retrieveMultipleRecords 方法示例
此示例检索多个记录并使用 OData 并 限制返回的列和行计数。
let records = await $pages.webAPI.retrieveMultipleRecords('accounts','$select=name&$top=3');
$pages.languages
该 对象提供检索网站可用语言列表、获取当前活动语言和设置新活动语言的方法。
$pages.languages 方法
使用这些方法可读取可用语言、检查当前语言,并更改网站。
| 方法 | Description | 退货 |
|---|---|---|
getAll |
检索为网站启用的语言列表。 | string[] |
getActive |
检索当前活动语言。 | string |
setActive(language: string) |
将给定语言设置为活动语言。 | void |
注释
方法会导致页面重载。
$pages.languages 方法示例
这些示例演示如何列出所有语言、阅读活动语言并设置新的活动语言。
let allLanguages = $pages.languages.getAll();
let activeLanguage = $pages.languages.getActive();
$pages.languages.setActive('hi-IN');
$pages.agent
$pages.agent 对象提供了在站点与当前用户可用的Microsoft Copilot Studio代理之间建立通信的方法。
$pages.agent.SendActivity(
agentSchemaName: string,
inputActivity: object,
responseSubscriber: function,
errorSubscriber: function
);
| 参数名称 | 类型 | Description |
|---|---|---|
agentSchemaName |
String | 将活动发送到的机器人的架构名称。 |
inputActivity |
对象 | 包含要发送到机器人的文本或事件的对象。 |
responseSubscriber |
函数 | 代理发送响应时运行的回调函数。 |
errorSubscriber |
函数 | 处理错误的回调函数。 |
返回类型:void - 函数不返回任何内容。
来自代理的响应对象采用以下格式接收:
| Name | 类型 | Description |
|---|---|---|
type |
String | 活动类型,例如消息。 |
text |
String | 可选,来自代理的消息。 |
textFormat |
String | 可选,消息文本的格式,如 markdown、纯或 XML。 |
Id |
String | 唯一标识活动的 ID。 |
From |
对象 | 指定活动的发送方(包括 ID、名称(可选)和角色信息)。 |
Conversation |
对象 | 包含活动所属的对话的 ID。 |
InputHint |
String | 可选,指示机器人是接受、期望还是忽略用户输入。 |
replyToId |
String | 答复消息的 ID。 |
示例
回调方法
定义和回调函数以处理代理响应和错误。
const responseSubscriber = (response) => {
// Replace with your response handling.
console.log('Agent response:', response);
};
const errorSubscriber = (error) => {
// Replace with your error handling.
console.error('Error:', error);
};
// Replace with your agent schema name.
const agentSchemaName = 'agent SchemaName';
将消息发送到代理
const inputActivity = {
text: 'Hello!', // Message to the agent.
};
$pages.agent.SendActivity(agentSchemaName, inputActivity, responseSubscriber,
ErrorSubscriber);
调用客户端事件
const inputActivity = {
name: 'AgentEvent', // The name of the event to be invoked
value: {key1:'value1', key2:'value2'} // Open-ended value used to carry additional data or payloads necessary for specific agent operations or responses
};
$pages.agent.SendActivity(agentSchemaName, inputActivity, responseSubscriber,
ErrorSubscriber);
错误消息
下面是用户可能会遇到的错误消息及其潜在原因。
| 错误类型 | 原因 | 用户的错误消息 |
|---|---|---|
| 代理架构验证 | 提供的机器人架构名称无效或用户无权访问代理 | Invalid bot schema name or access denied. Please check the bot schema name and try again. |
| 提取令牌错误 | 提取直接线路令牌时出错 | Something went wrong while fetching the token. Please try again. |
| 发布活动错误(重试) | 发布活动并需要重试时出错。 | Something went wrong while posting the activity: retry. |
| 发布活动错误(超时) | 等待传出消息或 postActivity 时超时 | Timed out while posting activity: Please retry. |
| 发布活动错误(活动无效) | 输入活动没有用于调用事件的文本或名称。 | Invalid activity: At least one of text, name, or attachments must be provided. |
| 发布活动错误(找不到用户 ID 或找不到令牌) | 在会话存储中找不到令牌,或者在令牌中找不到用户 ID | Error retrieving user ID: {error message} |
| 发布活动错误(常规) | 发布活动时发生未指定的错误 | Something went wrong while posting the activity: Please try again. |
| Direct Line 连接错误 | 与机器人建立直接线路连接时出错。 | Something went wrong while creating direct line connection: Please try again. |
| 常规错误 | 不属于上述类别的意外错误 | An unexpected error occurred while sending activity: Please try again. |