使用非类型化对象和动态对象

在 Power Apps 中处理操作时,可能会遇到某些操作的非类型化返回值或输入值。 以前,Power Apps 会忽略非类型化或动态输入字段,并且它们在 PowerFX 表达式中不可见,但现在,您可以直接使用这些字段。 以前,当返回类型为非类型化时,Power Apps 将返回一个布尔值。 现在,它会返回一个非类型化对象。

备注

假设您的 Power Fx 表达式依赖于这些函数中的布尔返回值。 在这种情况下,您将必须重写公式并将非类型对象显式转换为布尔值。 某些函数(如“IfError”)还不完全支持非类型化对象。 如果您的表达式包含此类函数,请参阅本文末尾的说明以了解变通方法。

传入非类型化对象作为参数

某些操作需要非类型化对象作为参数值。 如果您有 Power Fx 记录,可以将其转换为非类型化对象,从而使其适合传递给操作。

在下面的示例中,Dataverse 客户表上可用的合并操作需要多个非类型化参数。 为了做好准备,我们将定义三个变量来保存 TargetObject、SubordinateObject 和 UpdateContextObject。 我们首先将文本字符串 Microsoft.Dynamics.CRM.account 分配给一个变量,整个示例中将重复使用该变量。

Set (OdataType, “Microsoft.Dynamics.CRM.account”);

然后为 TargetObject 分配一个 Power Fx 记录,其属性名称为 accountid 和 @odata.type。 我们同样将 Power Fx 记录分配给 Subordinate 和 UpdateContext 对象。

Set (TargetObject, {name: "Test 2", accountid: "145dc2ba-85a2-ed11-aado-0022482d76a5", '@odata.type': OdataType});
Set (SubordinateObject, {name: FirstRecord.’Account name’, accountid: FirstRecord.Account, ‘@odata.type’ : OdataType });
Set (UpdateContextObject, {telephone1: FirstRecord.’Main Phone’, address1_city: FirstRecord.’Address 1 : City’, ‘@odata.type’ : OdataType }); 

接下来,我们将再创建三个变量来存储转换后的非类型化记录:TargetUntypedObject、SubordinateUntypedObject 和 UpdateContextUntypedObject。 要执行转换,我们将对原始变量使用 ParseJSON(JSON()) 函数。 此操作会将 Power Fx 记录转换为非类型化对象。

Set (TargetUntypedObject, ParseJSON(JSON(TargetObject)));
Set (SubordinateUntypedObject, ParseJSON(JSON(SubordinateObject)));
Set (UpdateContextUntypedObject, ParseJSON(JSON(UpdateContextObject)));

最后,我们通过传入必要的参数(包括非类型化和类型化参数)来调用合并操作:

Environment.Merge({Target: TargetUntypedObject, Subordinate: SubordinateUntypedObject, UpdateContent: UpdateContextUntypedObject, PerformParentingChecks: false  });

使用通过操作返回的非类型化对象

如果基于操作的连接器返回了一个对象,则可以直接访问其属性,而与是否为它们分配了类型无关。 但是,如果您打算在 Power Apps 中将某个属性用于特定目的,例如用于加标签,您需要先转换它。

在下面的示例中,httpRequest 函数返回以前作为布尔值转换的非类型化对象。

Set (response, Office365Groups.HttpRequest("/v1.0/me", "GET", ""));

响应中的一个属性是 displayName。 可以使用如下所示的 Power Fx 表达式来访问和转换它:

Text(response.displayName)

转换为对象文本以在 Power Apps 标签控件中使用它。

使用 Dynamics 字段

操作响应现在捕获动态输出,您可以利用上述方法访问这些属性。 此外,还可以使用动态输入字段。

请考虑 Microsoft Teams 中具有动态输入正文参数的“GetMessageDetails”操作。 以前,无法查看或指定此参数。 经过最近更新后,您可以使用适当的 Power Fx 记录结构设置一个名为“body”的变量。

Set ( body, ParseJSON(JSON( {recipient: { groupID: “7f733b36-7c7f-4f4c-9699-0a7b7a2b3897”, channelID: “19: 085d522328fb4a439220641006f7f25@thread.tacv2”}}));

然后,我们可以调用 GetMessageDetails 操作并将响应分配给 teamsResponse 变量。

Set (teamsResponse, MicrosoftTeams.GetMessageDetails ( 1661365068558, “channel”, body ));

转换返回以前返回布尔值的非类型化对象的公式。

Power Fx 采用有限数量的非类型化对象,因此您的公式可能需要显式转换。 特别是,如果您的公式依赖于布尔响应,那么您将需要进行转换。 如果您只需知道是否存在错误,则可以使用 IsError 函数:

If(
  IsError(Office365Outlook.CalendarDeleteItemV2("Calendar", 1)),
  Notify("An Outlook appointment could not be found or could not be deleted")
)

要访问仅通过 IfError 提供的错误信息,您必须使用转换函数(如 Boolean、Text 或 Value)将非类型对象转换为有效类型。 如果给定这些函数,它们将产生错误。 以下示例介绍了这个情况:

With({result: Office365Outlook.CalendarDeleteItemV2("Calendar", 1)},
If( IsError(result),
  IfError(
    Boolean(result),  // any conversion function would do, such as Text, Value, …
    Notify("An Outlook appointment could not be found or could not be deleted: " & FirstError.Message)
) ) )