使用 Lightning 消息服务跨 DOM 进行通信

使用 Lightning 消息服务在 Lightning 页面内的 DOM 之间进行通信。 在同一 Lightning 页面中嵌入的 Visualforce 页面、Aura 组件和 Lightning Web 组件,包括实用程序栏中的组件和弹出式实用程序。选择 组件是订阅来自整个应用程序的消息,还是仅订阅来自活动应用程序的消息 面积。

如果您要从 Salesforce Classic 切换到 Lightning Experience,您现在可以构建 可以与现有 Visualforce 页面或 Aura 组件进行通信的 Lightning Web 组件。 您还可以使用 Lightning 消息服务通过 Open CTI 与软件电话进行通信。

重要

Lightning 消息服务在 Lightning Experience 中提供,并作为 Experience Builder 站点中使用的 Lightning 组件的测试版功能。

要在 Visualforce 中访问 Lightning 消息服务,请使用全局变量。消息是可序列化的 JSON 对象。示例 可以在消息中传递的数据包括字符串、数字、对象和布尔值。一条消息 不能包含函数和符号。全局变量仅在 Lightning Experience 中可用。$MessageChannel$MessageChannel

使用在组织内创建的消息通道

以下是使用在您的组织内开发的 Lightning 消息通道的示例。

<apex:page>
    <script>
        // Load the MessageChannel token in a variable
        var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
    </script>
</apex:page>

在这里,我们引用一个带有公式表达式的自定义消息通道。此表达式 创建一个我们分配给变量的令牌。 此令牌对于您的自定义消息通道是唯一的,可以在 Lightning 消息中使用 服务 API 方法。语法引用元数据类型的自定义实例。后缀表示它是自定义的, 但请注意,它不是自定义对象。有关详细信息,请参阅创建消息通道。{!$MessageChannel.SampleMessageChannel__c}SAMPLEMCSampleMessageChannel__cLightningMessageChannel__c

如果您的组织具有命名空间,请不要将其包含在消息通道表达式中。例如 如果组织的命名空间是 MyNamespace,则消息通道表达式仍为 。“{!$MessageChannel.SampleMessageChannel__c}”

使用在组织外部创建的消息通道

要使用来自组织外部的开发人员创建的包的消息通道,请参考 他们用语法。例如,如果不是您的组织的本地用户,并且来自 命名空间为 SamplePackageNamespace 的包,语法为 .{!$MessageChannel.Namespace_name__c}SampleMessageChannel{$MessageChannel.SamplePackageNamespace__SampleMessageChannel__c}

  • 创建消息通道
    要在组织中创建 Lightning 消息通道,请使用 LightningMessageChannel 元数据类型。
  • 在消息通道
    上发布 要从 Visualforce 页面在消息通道上发布,请在页面的 JavaScript 代码中包含全局变量,并编写调用 .$MessageChannelsforce.one.publish()
  • 订阅和取消订阅消息通道 若要订阅和取消订阅消息通道
    ,请使用 和 方法。sforce.one.subscribe()sforce.one.unsubscribe()
  • 注意事项和限制
    在 Visualforce 中使用 Lightning 消息服务时,请牢记这些注意事项和限制。

创建消息通道

要在您的组织中创建 Lightning 消息通道,请使用 LightningMessageChannel 元数据类型。

注意

请参阅《元数据 API 开发人员指南》中的 LightningMessageChannel(可以是 在发布预览期间已过时或不可用)。

要将 LightningMessageChannel 部署到您的组织中,请创建一个 SFDX 项目。包括 XML force-app/main/default/messageChannels/ 目录中的定义。这 LightningMessageChannel 文件名遵循 .messageChannel-meta.xml 格式。要将其添加到临时组织,请运行 。要将其添加到其他类型的组织, 例如沙盒或 Developer Edition 组织,请运行 .messageChannelNamesfdx force:source:pushsfdx force:source:deploy

在消息通道上发布

要从 Visualforce 页面在消息通道上发布,请在页面的 JavaScript 代码中包含全局变量 并编写一个调用 .

$MessageChannelsforce.one.publish()

github.com/trailheadapps/lwc-recipes 存储库中的页面演示如何发布 选择联系人时在 Lightning 页面上通知订阅者的消息。

lmsPublisherVisualforce

以下示例演练了 Visualforce 页面标记,以演示如何发布到 单击按钮时的消息通道。

在页面的 JavaScript 中,我们首先获取对自定义 Lightning 消息通道的引用 使用公式表达式 。此表达式创建一个令牌,该令牌 对于您的消息频道是唯一的。然后,我们将令牌作为字符串分配给变量 。{!$MessageChannel.SampleMessageChannel__c}SAMPLEMC

该函数包含以下消息 我们想要发布的内容。在这里,消息是值为 “some string” 和 ,其值是键值对值 value: “some value”。然后我们调用 Lightning 消息服务 API 的方法 对象。该函数采用两个参数,一个包含消息通道的字符串 令牌和消息负载。handleClick()recordIdrecordDatapublish()sforce.onepublish()

在页面标记中,我们创建一个按钮并调用它的方法。handleClick()onclick()

<apex:page >
    <script>
    // Load the MessageChannel token in a variable
    var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
    function handleClick() {
        const payload = {
            recordId: "some string",
            recordData: {value: "some value"}
        }
        sforce.one.publish(SAMPLEMC, payload);
      }
    </script>
    <div>
    <p>Publish SampleMessageChannel</p>
    <button onclick="handleClick()">Publish</button>
    </div>
</apex:page>

订阅和取消订阅消息通道

若要订阅和取消订阅消息通道,请使用 和 方法。

sforce.one.subscribe()sforce.one.unsubscribe()

github.com/trailheadapps/lwc-recipes 存储库中的页面显示如何订阅和取消订阅消息通道。

lmsSubscriberVisualforceRemoting

以下示例是“在消息通道上发布”中示例的延续,该示例允许您订阅和取消订阅 从消息通道中单击相应的按钮。在 JavaScript 中,我们 具有 and 方法,并使用消息输出填充subscribeMC()unsubscribeMC()onMCPublished()textarea

将自定义消息通道加载到变量 中。全局变量为 关联的消息通道。在 下 , 我们 声明 保存从该方法返回的 Subscription 对象。$MessageChannel.SampleMessageChannel__cSAMPLEMC$MessageChannelSAMPLEMCsubscriptionToMCsforce.one.subscribe()

该方法检查 订阅对象为空。如果是,则调用该方法。 有两个参数, 订阅消息通道,以及处理消息输出的方法。subscribeMC()sforce.one.subscribe()sforce.one.subscribe()onMCPublished()默认情况下,通过消息通道的通信只能在 活动导航选项卡、活动导航项或实用程序项。效用 项目始终处于活动状态。导航选项卡或项目在选中时处于活动状态。 导航选项卡和项目包括:

  • 标准导航选项卡
  • 控制台导航工作区选项卡
  • 控制台导航子选项卡
  • 控制台导航项

若要从应用程序中的任何位置接收消息通道上的消息,请使用该方法的可选 第四个参数 .将 设置为值。

sforce.one.subscribe()subscriberOptionsscopesubscriberOptions“APPLICATION”

sforce.one.subscribe(messageChannel, listener, {scope: "APPLICATION"});

该方法检查是否 有一个订阅对象。如果是这样,它将调用 并传入对象。然后,它清除对象。unsubscribeMC()sforce.one.unsubscribe()subscriptionToMCsubscriptionToMC

该方法将 消息有效负载从 JSON 对象转换为字符串。然后,它会在 ID 中显示消息。onMCPublished()textareaMCMessageTextArea

<apex:page >
    <div>
        <p>Subscribe to SampleMessageChannel </p>
        <button onclick="subscribeMC()">Subscribe</button>
        <p>Unsubscribe from subscription</p>
        <button onclick="unsubscribeMC()">Unsubscribe</button>
        <br/>
        <br/>
        <p>Received message:</p>
    <textarea id="MCMessageTextArea" rows="10" style="disabled:true;resize:none;width:100%;"/>
    </div>

    <script>
        // Load the MessageChannel token in a variable
        var SAMPLEMC = "{!$MessageChannel.SampleMessageChannel__c}";
        var subscriptionToMC;

        function onMCPublished(message) {
            var textArea = document.querySelector("#MCMessageTextArea");
            textArea.innerHTML = message ? JSON.stringify(message, null, '\t') : 'no message payload';
        }

        function subscribeMC() {
            if (!subscriptionToMC) {
                subscriptionToMC = sforce.one.subscribe(SAMPLEMC, onMCPublished);
            }
        }

        function unsubscribeMC() {
            if (subscriptionToMC) {
                sforce.one.unsubscribe(subscriptionToMC);
                subscriptionToMC = null;
            }
        }
    </script>

</apex:page>

注意事项和限制

在使用 Lightning 消息时,请牢记这些注意事项和限制 Visualforce 中的服务。考虑闪电消息服务不适用于 在 Chatter 中加载页面时的 Visualforce 库 使用 .请改用本机 Lightning Publisher。sforce.one<chatter:feed showPublisher=”true”/>Lightning 消息服务在 Lightning 中包含的 Visualforce 页面中不起作用 通过 iframe(包括 、 和标准 HTML 标记)进行体验。相反,请通过 Lightning 应用程序生成器或作为实用程序栏项目。<wave:dashboard><apex:iframe><iframe>Visualforce 仅支持 Lightning 消息通道,其中为 true。有关 LightningMessageChannel 的更多信息,请参阅元数据 API 开发人员指南。isExposed闪电消息服务在 Salesforce Classic 中或预览 Visualforce 时不起作用 从设置。局限性闪电消息服务仅支持这些 经验。

  • Lightning Experience 标准导航
  • Lightning Experience 控制台导航
  • 适用于 Aura 和 Lightning Web 组件的 Salesforce 移动应用程序,但不适用于 Visualforce 页面
  • Experience Builder 站点中使用的 Lightning 组件。对 Experience Builder 的支持 网站是测试版。注意闪电消息服务 不 在 Experience 中使用 Salesforce 选项卡 + Visualforce 站点或 Visualforce 页面 建设者网站。