本篇参考:

https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_subscribe_lc.htm

https://developer.salesforce.com/docs/component-library/bundle/lightning-emp-api/documentation

salesforce零基础学习(九十六)Platform Event浅谈

Salesforce LWC学习(五) LDS & Wire Service 实现和后台数据交互 & meta xml配置

背景: 我们在记录的详情页面,除标准的layout以外,实际工作中也会添加各种各样的component来满足实际业务的需要,有一些是标准组件,有一些是自定义组件。自定义组件间的修改和交互很好弄,我们可以通过 notifyRecordUpdateAvailable搞定(Lighting Data Service)LDS的缓存问题,通过 refreshApex搞定 call apex方法的问题,通过 dispatchEvent / handler方式来搞定父子组件通信的事情,通过pub / sub事件模型来搞定跨组件通讯问题,通过 lightning message service或者 dynamic interaction也可以搞定跨组件通讯问题。如上的内容都是自定义组件之间或者自定义组件的行为渲染到标准组件。那我们如何针对标准组件的更新作用到自定义页面,然后自定义页面捕捉到这些事件操作呢? 本篇提供两种思路。

需求: 当用户在Account详情页面更新数据时,不管使用 quick action的Edit还是 Inline Edit,当Account的Name包含Test的字样,显示一个toast信息。

一. 基于Lightning Data Service(LDS)

这个demo可以基于getRecord的这个wire adapter来实现。因为 getRecord以及标准UI都共用同一个version的数据,所以当标准UI因为用户修改以后,我们通过 getRecord也同样可以自动收到最新的version的数据,所以我们可以基于 getRecord的这个wire adapter来实现。

import { LightningElement, api, wire } from 'lwc';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import { getRecord } from 'lightning/uiRecordApi';
import NAME_FIELD from "@salesforce/schema/Account.Name";
export default class toastDemo extends LightningElement { @api recordId; @wire(getRecord, { recordId: '$recordId', fields: [NAME_FIELD]})
// eslint-disable-next-line no-unused-vars
wiredAccount(data, error) {
if (data.data && data.data.fields && data.data.fields.Name) {
if(data.data.fields.Name.value.includes('test')) {
this.showToast();
}
} else if(error) {
console.log('error');
}
} showToast() {
const evt = new ShowToastEvent({
message: 'Name contains test',
variant: 'info',
});
this.dispatchEvent(evt);
}
}

效果演示:将这个组件放在 lightning record page中

二. 基于Platform Event 订阅实现

如果对Platform Event不了解的,欢迎查看以前的博客内容。思路为当Account Name变动以后,发布一个Account的Platform Event,lwc端用来订阅这个Platform Event,对订阅的结果进行解析,如果满足了预期,则进行逻辑处理。

1. 创建Platform Event的表以及字段。

2. 通过Flow或者Trigger,Account Name包含test情况下,发布Platform Event.

3. lwc进行订阅:这里看一下加粗的两行,messageCallback函数看上去有自己的上下文,如果不传递进去,获取的recordId则为 undefined, context也相同。

import { LightningElement, api, wire } from "lwc";
import { ShowToastEvent } from "lightning/platformShowToastEvent";
import { subscribe, unsubscribe, onError, setDebugFlag, isEmpEnabled } from "lightning/empApi";
export default class toastDemo extends LightningElement {
channelName = "/event/Account_Change__e"; @api recordId; get changedRecordId() {
return this.targetedRecordId;
} subscription = {}; // Initializes the component
connectedCallback() {
// Register error listener
this.registerErrorListener();
const currentRecordId = this.recordId;
const context = this
;
const messageCallback = function (response) {
// Response contains the payload of the new message received
let event = response.data.payload; if (event.Account_Id__c == currentRecordId) {
const evt = new ShowToastEvent({
message: "Name contains test",
variant: "info"
});
context.dispatchEvent(evt);
}
}; // Invoke subscribe method of empApi. Pass reference to messageCallback
subscribe(this.channelName, -1, messageCallback).then((response) => {
// Response contains the subscription information on subscribe call
console.log("Subscription request sent to: ", JSON.stringify(response.channel));
this.subscription = response;
});
} disconnectedCallback() {
unsubscribe(this.subscription, (unsubResp) => {
console.log("unsubscribe() response: ", JSON.stringify(unsubResp));
});
} registerErrorListener() {
// Invoke onError empApi method
onError((error) => {
console.log("Received error from server: ", JSON.stringify(error));
// Error contains the server-side error
});
}
}

效果:

总结:本篇主要介绍的是标准页面编辑数据情况下自定义的lwc页面如何进行捕捉然后做一些逻辑,其中LDS方式固然好用,但是没有那么灵活,如果需求简单,推荐使用LDS方式,否则可以考虑订阅Platform Event来实现。篇中有错误地方欢迎指出,有不懂欢迎留言。

Salesforce LWC学习(四十七) 标准页面更新以后自定义页面如何捕捉?的更多相关文章

  1. Salesforce LWC学习(四十) dynamic interaction 浅入浅出

    本篇参考: Configure a Component for Dynamic Interactions in the Lightning App Builder - Salesforce Light ...

  2. Salesforce LWC学习(四十二) getRecordNotifyChange已弃用

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_get ...

  3. Salesforce LWC学习(四) 父子component交互 / component声明周期管理 / 事件处理

    我们在上篇介绍了 @track / @api的区别.在父子 component中,针对api类型的变量,如果声明以后就只允许在parent修改,son component修改便会导致报错. sonIt ...

  4. Salesforce LWC学习(二十七) File Upload

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/lightning-file-upload/documenta ...

  5. Salesforce LWC学习(三十七) Promise解决progress-indicator的小问题

    本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-progress-indicator/exa ...

  6. Salesforce LWC学习(四十) datatable的dynamic action的小坑浅谈

    本篇参考:https://developer.salesforce.com/docs/component-library/bundle/lightning-datatable/documentatio ...

  7. Salesforce LWC学习(四十一) If:true 即将弃用?

    本篇参考: https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reference_dir ...

  8. Salesforce LWC学习(三十) lwc superbadge项目实现

    本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist 我们做lwc的学习时 ...

  9. Salesforce LWC学习(十七) 前端知识之 onclick & onblur & onmousedown

    在Salesforce LWC学习(八) Look Up组件实现篇中,我们实现了公用的lookup组件,使用的过程中,会发现当我们输入内容以后,搜索出来的列表便无法被清空. 针对此种情况我们打算优化一 ...

  10. Salesforce LWC学习(三十九) lwc下quick action的recordId的问题和解决方案

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:hasRecordId/documentation ...

随机推荐

  1. dedebiz友情链接样式修改

    文件位置 /system/taglib/flink.lib.php 45行位置 根据自己需求修改就行

  2. 吴恩达人工智能-python实现逻辑回归

    吴恩达人工智能 逻辑回归python代码实现 逐行注释 import numpy as np import pandas as pd from matplotlib import pyplot as ...

  3. c语言代码练习7

    //输出0-100的三倍数字#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() { int i = 0; int ...

  4. 【Flutter】如何优美地实现一个悬浮NavigationBar

    [Flutter]如何优美地实现一个悬浮NavigationBar 最近写代码的时候遇到了一个如下的需求: 整体来说,底部的条是一个浮动的悬浮窗,有如下的三个按钮: 点击左边的要进入"主页& ...

  5. 带宽优化新思路:RoCE网卡聚合实现X2增长

    本文分享自华为云社区<2个RoCE网卡Bond聚合,实现带宽X2>,作者: tsjsdbd . 我们知道操作系统里面,可以将2个实际的物理网卡,合体形成一个"逻辑网卡" ...

  6. Django CMS搭建--1.虚拟环境搭建

    客户端环境:windows10 1.virtualenv使用 virtualenv 是 Python 中的一个包,用于创建和管理虚拟环境,可以在不同的项目中使用不同的 Python 版本和第三方库,避 ...

  7. 使用Eclipse生成CHM帮助文档(图解)

    使用Eclipse生成CHM帮助文档(图解) 博客分类: System Operate javadoc生成chm文档java生成api帮助文档api帮助文档生成工具 Eclipse JavaDoc和j ...

  8. 探索CPU的黑盒子:解密指令执行的秘密

    引言 在我们之前的章节中,我们着重讲解了CPU内部的处理过程,以及与之密切相关的数据总线知识.在这个基础上,我们今天将继续深入探讨CPU执行指令的相关知识,这对于我们理解计算机的工作原理至关重要. C ...

  9. js数据结构--字典

    <!DOCTYPE html> <html> <head> <title></title> </head> <body&g ...

  10. CF1401B [Ternary Sequence]

    Problem 题目简述 两个序列 \(A, B\).这两个序列都是由 \(0,1,2\) 这三个数构成. \(x_1,y_1,z_1\) 和 \(x_2,y_2,z_2\) 分别代表 \(A\) 序 ...