I'm trying to pass the information of my table after click on add button, the component should pass the value of each cell in the selected row to a child component that is a table true. i'm actually using message channel to fix this but it is no working.
<template> <lightning-card title="New Product Shipment"> <lightning-layout multiple-rows="true" vertical-align="end"> <lightning-layout-item size="8" padding="around-small"> <lightning-input type="text" label="Search Products" value={productName} onchange={handelproductName} placeholder="Product Name"> </lightning-input> </lightning-layout-item> <lightning-layout-item size="3" padding="around-small"> <lightning-button label="Search" variant="brand" onclick={getProducts}> </lightning-button> </lightning-layout-item> </lightning-layout> <lightning-layout multiple-rows="true" vertical-align="end"> <lightning-layout-item size="6" padding="around-small"> <!--tabla con productos--> <template if:true={showTables}> <table class="slds-table slds-table--bordered slds-table--cell-buffer" id="table"> <thead> <tr class="slds-text-title--caps"> <th scope="col"> <div class="slds-truncate">Products </div> </th> <th scope="col"> <div class="slds-truncate">Quantity</div> </th> <th scope="col"> <div class="slds-truncate">Add</div> </th> </tr> </thead> <tbody> <template for:each={products} for:item="product" for:index="index"> <tr key={product.Id}> <td> {product.Name} </td> <td> <div class="slds-m-bottom_large"> <lightning-input type="Number" name={index} onchange={handleChange}> </lightning-input> </div> </td> <td> <div> <lightning-button data-id={product.Id} key={product.Id} variant="brand-outline" label="Add" title="Primary action with lighter look" onclick={handleClick} name={index} disabled={Buttontrue} class="slds-m-left_x-small"></lightning-button> </div> </td> </tr> </template> </tbody> </table> <br /> <div class="slds-align_absolute-center"> <div class="slds-p-right_xx-small"> <lightning-button label="Prev" disabled={isPrev} onclick={handlePrev} variant="brand" icon-name="utility:back" name="prev"></lightning-button> </div> <span class="slds-badge slds-badge_lightest"> {recordStart}-{recordEnd} of {totalRecords} | Page {pageNumber} of {totalPages} </span> <div class="slds-p-left_xx-small"> <lightning-button label="Next" disabled={isNext} onclick={handleNext} variant="brand" icon-name="utility:forward" icon-position="right" name="next"></lightning-button> </div> </div> </template> <template if:true={isDisplay}> <div class="slds-align_absolute-center"> <br /> No records found </div> </template> </lightning-layout-item> <lightning-layout-item size="6" padding="around-small"> <template if:true={showTables}> <c-child-Table-Comp productshipments={rowData}></c-child-Table-Comp> </template> </lightning-layout-item> </lightning-layout> </lightning-card> parent js
import { LightningElement, api, track, wire} from 'lwc'; import SearchProducts from '@salesforce/apex/SearchController.SearchProducts'; import SelectedProducts from '@salesforce/messageChannel/SelectedProducts__c'; import { publish, MessageContext } from 'lightning/messageService'; export default class CreateProductShipment extends LightningElement { productShipment; @api recordId; quantity ; @track pageSize = 5; @track pageNumber = 1; @track totalRecords = 0; @track totalPages = 0; @track recordEnd = 0; @track recordStart = 0; @track isPrev = true; @track isNext = true; @track products = []; @track errors = null; @track isDisplay = false; @track value = 0; array = []; @track product; @track showChild = false; @track showTables = false; lickedButtonLabel; @track Buttontrue=true; @track test = false; @wire(MessageContext) messageContext; visibleProducts; handelproductName(event){ this.productName = event.target.value; } getProducts(){ SearchProducts({ prodName: this.productName, pageSize : this.pageSize, pageNumber : this.pageNumber }) .then(result => { if(result){ var resultData = JSON.parse(result); this.products = resultData.products; this.pageNumber = resultData.pageNumber; this.totalRecords = resultData.totalRecords; this.recordStart = resultData.recordStart; this.recordEnd = resultData.recordEnd; this.totalPages = Math.ceil(resultData.totalRecords / this.pageSize); this.isNext = (this.pageNumber == this.totalPages || this.totalPages == 0); this.isPrev = (this.pageNumber == 1 || this.totalRecords < this.pageSize); if(this.products){ if(this.products.length == 0){ this.isDisplay = true; this.showTables = false; }else{ this.isDisplay = false; this.showTables = true; } } } }) .catch(error => { this.errors = error; }); } handleNext(){ this.pageNumber = this.pageNumber+1; this.getProducts(); } handlePrev(){ this.pageNumber = this.pageNumber-1; this.getProducts(); } handleChange(event){ this.value = event.target.value if(this.value > 0){ this.Buttontrue=false; } } pdateContactHandler(event){ this.visibleProducts=[...event.detail.records] } handleClick(event) { const itemIndex = event.currentTarget.dataset.index; const rowData = this.visibleProducts[itemIndex]; publish(this.messageContext, SelectedProducts, rowData); console.log('row'+rowData); console.log(rowData.Name); } child html
<template> <lightning-card> <table class="slds-table slds-table--bordered slds-table--cell-buffer"> <thead> <tr class="slds-text-title--caps"> <th scope="col"> <div class="slds-truncate">Products </div> </th> <th scope="col"> <div class="slds-truncate">Quantity</div> </th> <th scope="col"> <div class="slds-truncate">Opportunity</div> </th> </tr> </thead> <tbody> <template for:each={productShipments} for:item="productshipment"> <tr key={productshipment.id}> <td> {productshipment.product} </td> <td> {productshipment.quantity} </td> <td> {productshipment.opportunity} </td> </tr> </template> </tbody> </table> </lightning-card> <lightning-button variant="brand" label="Save" type="submit" class="slds-m-right_x-small"> </lightning-button> </template> child js
import { LightningElement, api,wire } from 'lwc'; import { subscribe,unsubscribe,APPLICATION_SCOPE,MessageContext } from 'lightning/messageService'; import selectedProducts from "@salesforce/messageChannel/selectedProducts__c"; export default class ChildTableComp extends LightningElement { @api productShipments; subscription = null; @wire(MessageContext) messageContext; subscribeToMessageChannel() { if (!this.subscription) { this.subscription = subscribe( this.messageContext, selectedProducts, (message) => this.handleMessage(message), { scope: APPLICATION_SCOPE } ); } } unsubscribeToMessageChannel() { unsubscribe(this.subscription); this.subscription = null; } handleMessage(message) { this.productShipments = message.Name; console.log('prodd' + this.productShipments) } connectedCallback() { this.subscribeToMessageChannel(); } disconnectedCallback() { this.unsubscribeToMessageChannel(); } }