lwc关联笔记(3) LDS解说，以及 不推荐使用lds的原因

lds在lwc中的应用

1.首先我们需要在js文件中导入
这里面lightning/uiRecordApi的路径和getRecord方法都是固定的。必须保持一致。



~~~
import { LightningElement, api, wire } from 'lwc';
import { getRecord } from 'lightning/uiRecordApi';
~~~


2.引入需要得到的字段。并赋值给一个定数const。

~~~
import CONTACT_NAME_FIELD from '@salesforce/schema/Contact.Name';
import CONTACT_PHONE_FIELD from '@salesforce/schema/Contact.Phone';
const FIELDS = [CONTACT_NAME_FIELD, CONTACT_PHONE_FIELD];
~~~


3.用wire的方法去取得字段，当然，你得提供检索条件，record id。将结果绑定在一个对象上。

~~~
export default class WireGetRecordDynamicContact extends LightningElement {
    @api recordId;

    @wire(getRecord, { recordId: '$recordId', fields: FIELDS })
    contact;

    //这里我们使用了get的方法，是为了能在前台直接使用name这个字段
    //但其实这是没有必要的，直接在前台取更为方便
    
    get name() {
        return this.contact.data.fields.Name.value;
    }

    get phone() {
        return this.contact.data.fields.Phone.value;
    }
}
~~~


4.将结果在页面上进行表示

~~~
<template>
    <lightning-card icon-name="standard:contact">
        <template if:true={contact.data}>
            <p>{name}</p>
            <p><lightning-formatted-phone value={phone}></lightning-formatted-phone></p>
        </template>
    </lightning-card>
</template>
~~~



-----------------------------------------------
附带的，我们看看lds更新数据的做法。
但是在看做法之前我们先思考一下，我们为什么要使用lds。
就是为了减少调用后台apex，换言之，如果你不得不调用apex的时候，
其实你用lds还是不用，其实并没有什么区别。

这个时候有人提出来，如果可以循环调用updateRecord(recordInput).then的方法，是不是可以不使用后台了呢？

让我们看一下这里面的限制：
1.首先，不支持bulk更新，就是说你得一次一次调用，这其实是最主要的原因。
在后台里，我们是更新一个list或者插入一个list。
这里我们是一条一条做的，效率极差。如果你更新100条数据的list，想想这里的dml调用，等同于你在后台里写了一百条updat，还是一条一条执行的。

lightning/uiRecordApi does not support bulk records updates, this means you have to call it multiple times(In case you wanna update multiple rows of the data table or multiple objects)
2.因为本身没有引入transaction，所以也就没有rollback的操作，虽然说我们插入失败的时候也不rollback，而是直接报错。但这仍是欠缺。
As Avijit mentioned, there is no transaction control, which implies, if you update/insert multiple from JS, there is no complete rollback.
3.安全性低，所有的操作都在js里面写，很容易被攻击
You would want to sanitize your data on Server Side apex code, the reason being JS being browser-based is easy to hack, checking data sanity in triggers and validation rule might be bit late. The goal is to prevent bad data as soon as possible
4.比较复杂的操作，比如说涉及到trigger的，基本上做不到
Complex requirements like Disabling trigger while inserting few records cant be performed from lightning/uiRecordApi





我个人的看法是：
（lds适用于record的详细画面，而不是一览画面）

~~~
import { updateRecord } from 'lightning/uiRecordApi';
import FIRSTNAME_FIELD from '@salesforce/schema/Contact.FirstName';
import LASTNAME_FIELD from '@salesforce/schema/Contact.LastName';
import ID_FIELD from '@salesforce/schema/Contact.Id';
~~~


~~~
handleSave(event) {
        const fields = {};
        fields['Id'] = event.detail.draftValues[0].Id;
        fields['FirstName'] = event.detail.draftValues[0].FirstName;
        fields['LastName'] = event.detail.draftValues[0].LastName;

//另一种写法
/*
fields[ID_FIELD.fieldApiName] = this.contactId;
fields[FIRSTNAME_FIELD.fieldApiName] = this.template.querySelector("[data-field='FirstName']").value;
fields[LASTNAME_FIELD.fieldApiName] = this.template.querySelector("[data-field='LastName']").value;
*/


        const recordInput = {fields};

        updateRecord(recordInput).then(() => {
            this.dispatchEvent(
                new ShowToastEvent({
                    title: 'Success',
                    message: 'Contact updated',
                    variant: 'success'
                })
            );
        }).catch(error => {
             //这里是error处理
             //你可以在这里写逻辑操作
             //或者return一个json格式的值
        });
    }
~~~