Поле «Двойной список» в моем LWC повторно заполняет параметры записями, найденными из пользовательских входов ниже, однако я хочу, чтобы выбранные значения сохранялись в списке параметров при повторном поиске, очищая только те, которые они не выбрали. Я знаю, что смогу заставить это работать, если смогу получить массив значений и меток, поскольку в настоящее время я использую concat и новый набор для объединения необходимых параметров с объектами, которые они искали.

Я пробовал .map(), пытался использовать .push(), а также пробовал перебирать параметры и добавлять их в новый массив, если они соответствуют чему-либо в выбранном, но, похоже, ничего не работает.

JS

import { LightningElement, wire, track } from 'lwc';
import { NavigationMixin } from 'lightning/navigation';
import { getRecord, getFieldValue } from 'lightning/uiRecordApi';
import { ShowToastEvent } from 'lightning/platformShowToastEvent';
import BID from '@salesforce/schema/Object__c.Parent__c.Id';
import PROD from '@salesforce/schema/Object__c.Name';
import DATE from '@salesforce/schema/Object__c.Date';
import TIME from '@salesforce/schema/Object__c.Time';
import QUANTITY from '@salesforce/schema/Object__c.Quantity';
import EMAIL from '@salesforce/schema/Object__c.Email';
import PRODUCTID from '@salesforce/schema/Object__c.Product';
import getInitialRecords from '@salesforce/apex/Controller.initialRecords';
import dosearchRecords from '@salesforce/apex/Controller.searchRecords';
import docreation from '@salesforce/apex/Controller.createRecords';
import requiredRecords from '@salesforce/apex/Controller.linkedRecords';

const FIELDS = ['Object__c.Name',
'Object__c.Parent__c.Id',
'Object__c.Date',
'Object__c.Time',
'Object__c.Quantity',
'Object__c.Email',
'Object__c.Product'];

export default class scratchtest extends NavigationMixin(LightningElement) {

    _selected = [];
    selectedoptions = [];
    search = false;

    prodid = 'xxxxxxxxxxxxxxxxx';

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

    get productname() {
        return getFieldValue(this.product.data, PROD);
    }

    get prodlinkedid() {
        return getFieldValue(this.product.data, PRODUCTID)
    }

    get bookid() {
        return getFieldValue(this.product.data, BID)
    }

    get productdate() {
        return getFieldValue(this.product.data, DATE);
    }

    get producttime() {
        return getFieldValue(this.product.data, TIME);
    }

    get productquantity() {
        return getFieldValue(this.product.data, QUANTITY);
    }

    get custemail() {
        return getFieldValue(this.product.data, EMAIL);
    }

    requiredRecord = [];
    reqValue = new Set([]);
    @wire(requiredRecords, { productname: '$productname', producttime: '$producttime', productdate: '$productdate', bid: '$bookid' })
    requireddata({data,error}) {
        data && (this.requiredRecords = data.map(record => ({value: record.Record__c, label: record.Full__c})));
        data && (this.reqValue = data.map(record => record.Record__c));
    }

    inputFN = null;
    inputLN = null;
    inputDOB = null;

    handleFNInput(event) {
        this.inputFN = event.detail.value;
    }

    handleLNInput(event) {
        this.inputLN = event.detail.value;
    }

    handleDOBInput(event) {
        this.inputDOB = event.detail.value;
    }

    intoptions = [];
    @wire(getInitialRecords, { email: '$custemail' })
    recordsresult({data,error}) {
        data && (this.intoptions = data.map(record => ({value: record.Id, label: record.Full__c})));
    }

    searchoptions = [];

    combined = [];
    finalset = [];
    get options() {
        if(this.search == true) {
            this.combined = [].concat(this.searchoptions,this.requiredRecord,this.selectedvals);
            this.finalset = [...new Set(this.combined)];
            return this.finalset;
        }
        else{
            this.combined = [].concat(this.intoptions,this.requiredRecord);
            this.finalset = [...new Set(this.combined)];
            return this.finalset;
        }
    }

    handleChange(e) {
        this._selected = e.detail.value;
    }

    selectedvals = [];
    handleSearch() {
        if(this.inputFN != null && this.inputLN != null && this.inputDOB != null) {
            for(i=0;i<this._selected.length;i++) {
                for(x=0;x<this.options.length;x++) {
                    if(this._selected[i] == this.options[x].value) {
                        this.selectedvals.push({
                            value: this.options[x].value,
                            label: this.options[x].label,
                        })
                    }
                }
            }
            dosearchRecords({firstName: this.inputFN, lastName: this.inputLN, dob: this.inputDOB}).then((result) => {
                    result && (this.searchoptions = result.map(record => ({value: record.Id, label: record.Full__c})));
                }).catch((error) => {
                    this.error = error;
                })
            this.search = true;
        }
        else {
            this.dispatchEvent(new ShowToastEvent({
                title: 'Unable to search for Records',
                message: 'Please fill in all fields',
                variant: 'error'
            }),);
        }
    }

HTML

<template>
    <lightning-card title={cardTitle}>
        <div class="slds-p-around_small">
            <lightning-dual-listbox 
                name="languages"
                label="Select Records"
                source-label="Available Records"
                selected-label="Linked Records"
                options={options}
                onchange={handleChange}
                max={quantity}
                required-options={reqValue}
                disable-reordering=true
            ></lightning-dual-listbox>
        </div>
        <div class="slds-p-bottom_medium">
            <div class="slds-align_absolute-center">
                &nbsp;&nbsp;&nbsp;
                <lightning-input name="firstName" class="validate" type="text" label="First Name" value={inpFirstName} onchange={handleFNInput}></lightning-input> &nbsp;&nbsp;&nbsp;
                <lightning-input name="lastName" class="validate" type="text" label="Last Name" value={inpLastName} onchange={handleLNInput}></lightning-input> &nbsp;&nbsp;&nbsp;
                <lightning-input type="date" label="Date of Birth" value={inpDOB} onchange={handleDOBInput}></lightning-input> &nbsp;&nbsp;&nbsp;
            </div>
        </div>
        <div class="slds-align_absolute-center">
            <lightning-button
                label="Search"
                icon-name="utility:search"
                onclick={handleSearch}
            ></lightning-button>
        </div>           
    </lightning-card>
</template>
0
NewToThis 30 Ноя 2021 в 18:18
Добро пожаловать в СФСЭ! Пожалуйста, найдите время, чтобы посетить справочный центр, прокрутите тур и прочтите Как задавать вопросы. Можете ли вы редактировать существующий код, который не работает?
 – 
Kris Goncalves
30 Ноя 2021 в 16:42
Добавлено в код. Как я уже сказал, я пробовал много разных способов сделать это, но оставил свой самый обнадеживающий. единственная проблемная часть - это переменная selectedvals
 – 
NewToThis
30 Ноя 2021 в 17:09
Я думаю, вам нужно будет клонировать существующий массив и добавить значения. Прямо сейчас вы пытаетесь обновить неизменяемый массив.
 – 
nbrown
30 Ноя 2021 в 17:46
Почему selectedvals должны быть неизменными? Я создаю его исключительно для ввода значений, на него больше нигде не ссылаются, за исключением того, где я объединяю его в параметры (к чему он на самом деле не попадает, поскольку он не запускает класс вершины, который должен запускаться при нажатии кнопки поиска)
 – 
NewToThis
30 Ноя 2021 в 18:22

1 ответ

Лучший ответ

Я понял, что пропустил ключевое слово let в начале оператора for.

0
NewToThis 30 Ноя 2021 в 20:51