Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Salesforce lightning datatable inline editing using Lwc

Salesforce lightning datatable inline editing using Lwc

原创
作者头像
repick
发布于 2022-05-05 05:54:39
发布于 2022-05-05 05:54:39
52700
代码可运行
举报
文章被收录于专栏:SalesforceSalesforce
运行总次数:0
代码可运行

自定义的ListView中项目需要直接编辑的情况下,【lightning-datatable】组件也提供相应方法

1.首先在Html中添加onsave事件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<lightning-datatable
      onsave={handleSave}
      draft-values={draftValues}>
</lightning-datatable>

2.Js中的变量【draftValues】会保存编辑后的值,然后利用updateRecord方法进行更新处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { deleteRecord, updateRecord } from 'lightning/uiRecordApi';
import PHONE_FIELD from '@salesforce/schema/Contact.Phone';
import ID_FIELD from '@salesforce/schema/Contact.Id';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@track draftValues = [];
    handleSave(event) {
        const fields = {};
        fields[ID_FIELD.fieldApiName] = event.detail.draftValues[0].id;
        fields[PHONE_FIELD.fieldApiName] = event.detail.draftValues[0].phone;
        const recordInput = {fields};
        updateRecord(recordInput)
        .then(() => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: 'Success',
                    message: 'Contact updated',
                    variant: 'success'
                })
            );
            // Display fresh data in the datatable
            return refreshApex(this.wiredRecordList).then(() => {
                // Clear all draft values in the datatable
                this.draftValues = [];
            });
        }).catch(error => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: 'Error updating or reloading record',
                    message: error.body.message,
                    variant: 'error'
                })
            );
        });
    }

basicDatatable.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<template>
    <div style="background-color: white; border-bottom-style:double;">
        <lightning-layout multiple-rows="true" horizontal-align="center" vertical-align="center">
            <lightning-layout-item padding="around-small" size="5" style="position: absolute; left: 0%;">
                <span class="slds-var-p-right_x-small" style="font-size: 16px; font-weight: bold;">担当者</span>
                <span class="slds-var-p-right_x-small" style="font-size: 32px; font-weight: bold;">{recordLength}</span>
                <span class="slds-var-p-right_x-small" style="font-size: 16px; font-weight: bold;"></span>
            </lightning-layout-item>
            <lightning-layout-item padding="around-small" size="2">
                <span>&nbsp;</span>
            </lightning-layout-item>
            <lightning-layout-item padding="around-small" size="5" style="position: absolute; left: 80%;">
                <a style="background-color: #333333; color: white; padding: 10px; display: inline;" onclick={refresh}>
                    <lightning-icon class="slds-button__icon
                    slds-icon-utility-down slds-icon_container forceIcon" icon-name="utility:refresh" size="x-small">
                    </lightning-icon>
                </a>
                <span>&nbsp;</span>
                <a style="background-color: #333333; color: white; padding: 10px; display: inline;" onclick={handleDeleteClick}>
                    <lightning-icon class="slds-button__icon
                    slds-icon-utility-down slds-icon_container forceIcon" icon-name="utility:delete" size="x-small">
                    </lightning-icon>
                </a>
                <span>&nbsp;</span>
                <a style="background-color: #333333; color: white; padding: 10px; display: inline;" onclick={handleCreateClick}>
                    <lightning-icon class="slds-button__icon
                    slds-icon-utility-down slds-icon_container forceIcon" icon-name="utility:add" size="x-small">
                    </lightning-icon>
                </a>
            </lightning-layout-item>
        </lightning-layout>
    </div>
    <div style="height: 300px;">
        <lightning-datatable
                show-row-number-column
                max-row-selection="1"
                onrowselection={handelSelection}
                key-field="id"
                data={records}
                columns={columns}
                default-sort-direction={defaultSortDirection}
                sorted-direction={sortDirection}
                sorted-by={sortedBy}
                onsort={onHandleSort}
                onsave={handleSave}
                draft-values={draftValues}>
        </lightning-datatable>
    </div>
</template>

basicDatatable.js

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { LightningElement, wire, track } from 'lwc';
import getContactListView from '@salesforce/apex/MC_ContactListViewController.getContactListView';
import { loadStyle } from 'lightning/platformResourceLoader';
import COMMON_STATIC from '@salesforce/resourceUrl/common_sfdc_css';
import { refreshApex } from '@salesforce/apex';
import { deleteRecord, updateRecord } from 'lightning/uiRecordApi';
import PHONE_FIELD from '@salesforce/schema/Contact.Phone';
import ID_FIELD from '@salesforce/schema/Contact.Id';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
const columns = [
    //{ label: 'Name', fieldName: 'name', type: 'text', sortable: true },
    { label: 'Name', fieldName: 'idLink', type: 'url', sortable: true,
        typeAttributes: { label: { fieldName: 'name' }, target: '_self' }, initialWidth: 300 },
    { label: 'Email', fieldName: 'email', type: 'text', sortable: true },
    { label: 'Phone', fieldName: 'phone', type: 'text', sortable: true, editable: true },
    { label: 'OwnerName', fieldName: 'ownerName', type: 'text', sortable: true },
    { label: 'Birthdate', fieldName: 'birthdate', type: 'date', sortable: true },
];

export default class BasicDatatable extends LightningElement {
    columns = columns;
    @track refreshFlag = false;
    @track wiredRecordList = [];
    @track records;
    @track recordLength;
    @track selectedRecord;

    renderedCallback() {
        Promise.all([
            loadStyle(this, COMMON_STATIC + '/mcCommon.css')
        ]);
    }
    // eslint-disable-next-line @lwc/lwc/no-async-await
    async connectedCallback() {
    }

    @wire(getContactListView, {refreshFlag : '$refreshFlag'})
    wireRecords(result) {
        console.log('>>>>>result>>'+JSON.stringify(result));
        this.refreshFlag = false;
        this.wiredRecordList = result;
        if (result.data) {
            this.records = result.data;
            this.recordLength = result.data.length;
        } else if (result.error) {
            // エラー
        }
    }
    // refresh
    refresh() {
        refreshApex(this.wiredRecordList);
    }
    handelSelection(event) {
        if (event.detail.selectedRows.length > 0) {
            this.selectedRecord = event.detail.selectedRows[0].id;
        }
    }
    handleDeleteClick() {
        deleteRecord(this.selectedRecord)
        .then(() => {
            refreshApex(this.wiredRecordList);
        })
        .catch(error => {
        })
    }

    handleCreateClick() {
        let __self = this;
        let openUrl = '/s/contactcreatedata';
        let target = '_blank';
        let w = 680;
        let h = 580;
        let newWindow = window.open(openUrl, target, 'width=' + w + ',height=' + h)
            let iv = window.setInterval(function () {
                if (newWindow.closed) {
                    refreshApex(__self.wiredRecordList);
                    clearInterval(iv);
                }
            }, 1000);
    }

    @track defaultSortDirection = 'asc';
    @track sortDirection = 'asc';
    @track sortedBy;
    onHandleSort(event) {
        const { fieldName: sortedBy, sortDirection } = event.detail;
        let fields = new Map();
        fields.set('idLink', 'name');
        let sortByField = '';
        if (fields.has(sortedBy) ) {
            sortByField = fields.get(sortedBy);
        } else {
            sortByField = sortedBy;
        }
        const cloneData = [...this.records];
        cloneData.sort(this.sortBy(sortByField, sortDirection === 'asc' ? 1 : -1));
        console.log('>>cloneData>>:'+cloneData);
        this.records = cloneData;
        this.sortDirection = sortDirection;
        this.sortedBy = sortedBy;
    }

    sortBy(field, reverse, primer) {
        const key = primer
            ? function (x) {
                return primer(x[field]);
            }
            : function (x) {
                return x[field];
            };

        return function (a, b) {
            a = key(a);
            b = key(b);
            return reverse * ((a > b) - (b > a));
        };
    }

    @track draftValues = [];
    handleSave(event) {
        const fields = {};
        fields[ID_FIELD.fieldApiName] = event.detail.draftValues[0].id;
        fields[PHONE_FIELD.fieldApiName] = event.detail.draftValues[0].phone;
        const recordInput = {fields};
        updateRecord(recordInput)
        .then(() => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: 'Success',
                    message: 'Contact updated',
                    variant: 'success'
                })
            );
            // Display fresh data in the datatable
            return refreshApex(this.wiredRecordList).then(() => {
                // Clear all draft values in the datatable
                this.draftValues = [];
            });
        }).catch(error => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: 'Error updating or reloading record',
                    message: error.body.message,
                    variant: 'error'
                })
            );
        });
    }
}

3.效果展示

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Salesforce Lightning Data Table With Row Actions(二)
下边做成删除子画面,编辑子画面,分别进行消除和编辑操作,如下,点击Edit时,打开编辑子画面进行数据更新,点击Delete时,打开消除子画面进行数据消除。
repick
2022/05/10
7410
Salesforce Lightning Data Table With Row Actions(二)
Salesforce 如何实现Listview表示项目的画面迁移
image.png 如下当点击Link名称时,如何实现迁移到详细画面 image.png 1.首先在Apex中添加画面迁移用的项目【idLink】 MC_ContactListViewController.cls public with sharing class MC_ContactListViewController { @AuraEnabled(cacheable=true) public static List<ContactWrapper> getContactListView(B
repick
2022/05/03
6300
Salesforce 如何实现Listview表示项目的画面迁移
Salesforce学习 Lwc(十三)【InLineEdit】更新数据的三种方式
前边讲过如何使用【lightning-datatable】表示数据,以及一些基本样式,今天讲解在【InLineEdit】模式下,通过Lwc方法和Apex自定义方法进行编辑后的数据更新。
repick
2021/01/11
1.1K0
Salesforce学习 Lwc(十三)【InLineEdit】更新数据的三种方式
Salesforce How To Refresh Page Data in Lightning Web Component(三)
使用Lwc打开一个新的浏览器窗口,当关闭窗口时也可以进行刷新操作,如下,点击加号按钮,打开登录画面,当登录成功时刷新ListView列表。
repick
2022/05/03
4860
Salesforce How To Refresh Page Data in Lightning Web Component(三)
Salesforce How To Refresh Page Data in Lightning Web Component(一)
Lightning Web组件中通常使用wire取得数据,当条件发生变更时才会刷新,JS中提供另一种方法【refreshApex()】来刷新页面。
repick
2022/04/29
7080
Salesforce How To Refresh Page Data in Lightning Web Component(一)
Salesforce学习 Lwc(九)【数据初期取得与更新】运用详解
开发自定义画面经常遇到的场景就是增删改查,关于数据更新用到的几个方法进行一下总结,常用到的有以下几种。
repick
2020/12/29
1.1K0
Salesforce学习 Lwc(十八)【如何自定义开发关联List】
项目中,我们经常会用到关联List,标准ListView的做成这里就不多说了,今天我们使用Lwc自定义开发一个关联List,完成之后的效果请看下图,开发主要分为两部分,第一部分是使用【lightning-datatable】标签做成ListView,第二部分是使用【lightning-record-form】标签做成表单。
repick
2021/03/17
8340
Salesforce学习 Lwc(十八)【如何自定义开发关联List】
Salesforce LWC学习(三十) lwc superbadge项目实现
本篇参考:https://trailhead.salesforce.com/content/learn/superbadges/superbadge_lwc_specialist
Zero-Zhang
2020/12/29
1.7K0
Salesforce How To Refresh Page Data in Lightning Web Component(二)
image.png 删除处理同样可以利用refreshApex方法进行页面刷新 handleDeleteClick() { deleteRecord(this.selectedRecord) .then(() => { refreshApex(this.wiredRecordList); }) .catch(error => { }) } 效果展示: image.png image.png basicDatatable.htm
repick
2022/04/29
4910
Salesforce How To Refresh Page Data in Lightning Web Component(二)
Salesforce学习 Lwc(三)自定义开发时进行Validation验证
我们在使用 【lightning-record-edit-form】标签开发过程中,表单提交之后,画面输入的内容不符合要求时,error信息显示在项目上。
repick
2020/12/15
9340
Salesforce学习 Lwc(十)【lightning-datatable】
上一篇详细讲解了增删改查的初期数据取得和更新操作,还有一种场景是我们经常遇到的,就是ListView,在Lightning画面中可以创建一些标准ListView,但毕竟标准的东西有自己的限制,这样我们就可以自定义开发,今天主要讲解如何使用Lwc自定义LIstView。
repick
2020/12/30
1.3K0
Salesforce LWC学习(二十二) 简单知识总结篇二
https://developer.salesforce.com/docs/component-library/documentation/en/lwc/lwc.reactivity_fields
Zero-Zhang
2020/09/01
5770
Salesforce LWC学习(二十二) 简单知识总结篇二
Salesforce LWC学习(三十五) 使用 REST API实现不写Apex的批量创建/更新数据
https://developer.salesforce.com/docs/atlas.en-us.224.0.api_rest.meta/api_rest/resources_composite_composite.htm
Zero-Zhang
2021/07/08
2.5K1
Salesforce学习 Lwc(四)自定义开发 项目的label名重写
Lwc中开发中,通常情况下使用【lightning-input-field】,好处是通过使用【field-name】可以直接绑定项目即可实现画面项目与Object的Field之间的绑定。
repick
2020/12/16
5560
Salesforce学习 CommunityCloud(八)实现自定义error页面跳转
上一篇讲了自定义LogoutPage跳转,在我们正常开发过程中还会遇到需要跳转到自定义的error画面,例如当我们在Lwc中更新某个项目,但是在当前User下,没有更新权限,这样就需要跳转到自定义的Error画面,实现方法是首先做成一个VisualforcePage,用来显示error信息或者固定文言,然后在Community的Error Page装载VisualforcePage,最后在更新处理的方法实现调整,下边是具体步骤。
repick
2021/01/25
4480
Salesforce学习 CommunityCloud(八)实现自定义error页面跳转
Salesforce lightning datatable 每行表示Link项目
使用LightningDatatable做成的ListView时,有时需要自定义Link项目,例如需要Link式的行删除事件,当点击消除Link时,消除当前行数据,如下
repick
2022/05/20
6460
Salesforce lightning datatable 每行表示Link项目
Salesforce LWC学习(三十六) Quick Action 支持选择 LWC了
背景: 我们现在项目越来越多的使用 lwc 进行了前端开发,当然我们知道lwc并不能所有的场景都支持自己玩,比如组件之间的navigation、 quick action等都需要通过aura进行操作,aura套用lwc来实现。好消息是随着salesforce的release对lwc的不断发力,越来越多的功能可以通过lwc来使用。
冬夜先生
2021/09/08
7960
Salesforce LWC学习(三十三) lightning-datatable 翻页bug处理
本来lightning-datatable这种标签,基本上任何的项目都会用到而且很精通,所以当时感觉没有太大的单独一篇写的必要,在Salesforce LWC学习(三十) lwc superbadge项目实现 中也有使用这个标签的demo,所以有类似需要的小伙伴参考一下也可以照猫画虎搞定需求。项目中遇见了两个datatable的问题,解决以后感觉有必要写一下,后期遇见这种坑的小伙伴可以快速对应。话不多说,先弄一个简单的分页效果的UI,UI很丑,旨在实现功能。
Zero-Zhang
2021/03/27
1K0
Salesforce学习 Lwc(十二)【Lightning Message Service】
前边讲过方法【this.dispatchEvent()】的用法,可以实现父子Lwc组件之间的相互调用,今天讲解Communicate Across the DOM with Lightning Message Service,使用【Lightning message service】在Lightning页面内跨DOM进行通信,可以实现在嵌入在同一Lightning页面中的Visualforce页面,Aura组件和Lightning Web组件之间进行通信,可以不用
repick
2021/01/05
1.3K0
Salesforce学习 Lwc(十二)【Lightning Message Service】
Salesforce Add Sorting in Lightning Data Table in Lightning Web Component
image.png 点击列名进行进行排序功能 image.png 1.JS中为每一列设置【sortable:true】 const columns = [ { label: 'Name', fieldName: 'name', type: 'text', sortable: true }, { label: 'Email', fieldName: 'email', type: 'text', sortable: true }, { label: 'Phone', fieldName:
repick
2022/05/03
7170
Salesforce Add Sorting in Lightning Data Table in Lightning Web Component
推荐阅读
相关推荐
Salesforce Lightning Data Table With Row Actions(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验