CPQ 注意事项

article/2025/10/4 19:28:50

1.经常.id取不到值,最好要大写I,如图写;

 

 

 

Application Event 事件获取不到问题:错误信息:Cannot read property 'setParams' of undefined

之前代码如图:

onRefresh 事件一直是undefined,因为baseSvc是自定义的一个service,主要是调用后台,并callback,里面采用了ES6的语法,导致Application Event无法获取(目前不确定官方的callback方法会不会出现此类问题,但是自定义或者调用jQuery会出现),但是Component Event可以获取,于是通过下面的方法解决这种问题:

将application event 获取定义到invoke(callback)方法外面,即能获取到。

另外Application在handle的时候,是没有name属性的,一定要注意(component event必须有name属性):如图:

 

遇到一个问题,在使用attribute往子component传递属性的时候,子companies获取不到:

父component::

<aura:component description="LtngSPSalesBargainingScopeCmp" controller="LtngSPCustomerBargainingScopeCtrl"><aura:handler name="init" value="{!this}" action="{!c.doInit}"/><aura:attribute name="salesMessages" type="List" access="public"/><aura:attribute name="salesMessage" type="Object"/><aura:attribute name="areas" type="List" access="public"/><aura:attribute name="countries" type="List" access="public"/><aura:attribute name="showList" type="Boolean" default="true"/><aura:handler name="deleteSalesItem" event="c:LtngSPAreaMaterialsEvt" action="{!c.handleDeleteSales}"/><aura:handler name="editCustomerItem" event="c:LtngSPAreaMaterialsEvt" action="{!c.handleEditSales}"/><aura:handler name="onCancel" event="c:LtngSPAreaMaterialsEvt" action="{!c.doCancel}"/><c:LtngBaseService aura:id="baseService"/><aura:if isTrue="{!v.showList}"><lightning:layout multipleRows="true"><lightning:layoutItem padding="around-small" size="12"><lightning:layout><lightning:layoutItem largeDeviceSize="3" mediumDeviceSize="3" smallDeviceSize="3"flexibility="grow"size="3"><lightning:button label="Submit" variant="destructive" onclick="{!c.doSubmit}"/><lightning:button label="Add" variant="destructive" onclick="{!c.doAdd}"/><lightning:button label="Export" variant="destructive" onclick="{!c.doExport}"/></lightning:layoutItem><lightning:layoutItem largeDeviceSize="1" mediumDeviceSize="1" smallDeviceSize="1"flexibility="grow"size="1"><lightning:select label="Areas" aura:id="chooseAreas"name="chooseAreas" variant="label-hidden" class="slds-size_xx-small"><option value="All Areas" selected="selected">All Areas</option><aura:iteration items="{!v.areas}" var="item"><option value="{!item.name}">{!item.name}</option></aura:iteration></lightning:select></lightning:layoutItem><lightning:layoutItem largeDeviceSize="1" mediumDeviceSize="1" smallDeviceSize="1"flexibility="grow"size="1"><lightning:select label="Countries" aura:id="chooseCountries"name="chooseCountries" variant="label-hidden" class="slds-size_x-small"><option value="All Countries" selected="selected">All Countries</option><aura:iteration items="{!v.countries}" var="item"><option value="{!item.name}">{!item.name}</option></aura:iteration></lightning:select></lightning:layoutItem><lightning:layoutItem largeDeviceSize="1" mediumDeviceSize="1" smallDeviceSize="1"flexibility="grow"size="1" class="Margin_left"><lightning:input label="endDate" variant="label-hidden" placeholder="End Date"class="slds-size_xx-small"/></lightning:layoutItem><div style="line-height:32px;margin-right:30px;margin-left: 0px">--</div><lightning:layoutItem largeDeviceSize="1" flexibility="grow"size="1"><lightning:input label="startDate" variant="label-hidden" placeholder="Effective Date"/></lightning:layoutItem><lightning:layoutItem smallDeviceSize="2" mediumDeviceSize="2" largeDeviceSize="2"flexibility="grow"size="2"><lightning:button label="Search" variant="destructive" onclick="{!c.doSearch}"class="slds-size_xx-small"/></lightning:layoutItem></lightning:layout></lightning:layoutItem></lightning:layout><div aura:id="sales-container" class="sales-container"><lightning:card title=""><div class="h-container"><lightning:layout verticalAlign="center"><lightning:layoutitem size="1" padding="around-small"><ui:inputCheckbox/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">区域</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">国家</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">项目销售工程师-中方</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">项目销售工程师-外籍</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">渠道销售工程师-中方</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">渠道销售工程师-外籍</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">国家代表</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">生效日期</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">截止日期</lightning:layoutitem><lightning:layoutitem size="2" padding="around-small">操作</lightning:layoutitem></lightning:layout></div><aura:iteration items="{!v.salesMessages}" var="salesMessageItem"><c:LtngSPSalesBargainingScopeItemCmp salesMessage="{!salesMessageItem}"/> </aura:iteration></lightning:card></div><aura:set attribute="else"><!-- 此处传值失败,暂时通过method方法来传值 --><c:LtngSPSalesBargainingScopeDetailCmp salesMessage="{!v.salesMessage}"/></aura:set></aura:if>
</aura:component>

 

父controller:

/*** Created by zhezhana on 9/25/2018.*/
({doInit: function (component, event, helper) {
/**var areas = [{name: "North America",},{name: "West Europe",},{name: "East Asia",},];var countries = [{name: "USA",},{name: "CA",},{name: "France",},{name: "Poland",},];component.set("v.areas", areas);component.set("v.countries", countries);//    console.log(areas);var salesMessages = [{id: "1",area: 'West Europe',country: 'France',salesProjectCN: '5%',salesProjectFor: '5%',salesChannelCN: '15%',salesChannelFor: '15%',countryRepresent: '0%',effectiveDate: '20180401',closingDate: '0190301',},{id: "2",area: 'North America',country: 'USA',salesProjectCN: '0%',salesProjectFor: '0%',salesChannelCN: '20%',salesChannelFor: '10%',countryRepresent: '25%',effectiveDate: '20180301',closingDate: '20190101',},{id: "3",area: 'North America',country: 'USA',salesProjectCN: '0%',salesProjectFor: '0%',salesChannelCN: '20%',salesChannelFor: '10%',countryRepresent: '25%',effectiveDate: '20180301',closingDate: '20190101',}];// console.log(JSON.stringify(salesMessages));component.set("v.salesMessages", salesMessages);*/var baseSvc = component.find('baseService');/**get the action of apex controller**/var salesBargainingRangeData = component.get("c.getSalesBargainingRangeDatas");/**set param**/baseSvc.invoke(salesBargainingRangeData).then(function (result) {//invoked if the request succeedconsole.log('getSalesBargainingRangeDatas-result----------->' + JSON.stringify(result));component.set("v.salesMessages", result);}).catch(function (error) {//invoked if the request failconsole.log("***ERROR:" + error);});},doSubmit: function (component, event, helper) {alert("doSubmit");},doAdd: function (component, event, helper) {alert("doAdd");},doExport: function (component, event, helper) {alert("doExport");},doSearch: function (component, event, helper) {alert("doExport");},handleDeleteSales : function (component, event, helper) {var messageId = event.getParam("salesId");console.log("handleDeleteSales"+messageId);var salesMessages = component.get("v.salesMessages");var salesTemp = salesMessages.reduce((prev, item) => {if (item.id != messageId) {prev.push(item);}return prev;}, []);component.set("v.salesMessages", salesTemp);console.log(salesTemp);console.log("salesId::" + messageId);},handleEditSales : function (component, event, helper) {let mes = event.getParams("message");component.set('v.salesMessage',mes);console.log("new v.salesMessage--------->"+JSON.stringify(component.get("v.salesMessage")));component.set("v.showList",false);},doCancel : function(component, event, helper) {component.set("v.showList",true);}
})

 

子component:

<!--- Created by zhezhana on 9/28/2018.--><aura:component description="LtngSPSalesBargainingScopeDetailCmp"><aura:attribute name="salesMessage" type="Object"/><aura:registerEvent name="onCancel" type="c:LtngSPAreaMaterialsEvt"/><lightning:card title=""><aura:set attribute="actions"><lightning:button variant="destructive" label="Cancel" onclick="{!c.doCancel}"/></aura:set><p>name::{!v.salesMessage.Name}</p></lightning:card>
</aura:component>

 

子controller:

/*** Created by zhezhana on 9/25/2018.*/
({doCancel: function (component, event, helper) {var cancelEvt = component.getEvent("onCancel");cancelEvt.fire();},getSalesMessage: function (component, event, helper) {},
})

 

父的另一个子component:

<!--- Created by zhezhana on 9/28/2018.--><aura:component description="LtngSPSalesBargainingScopeItemCmp"><aura:attribute name="salesMessage" type="Object"/><aura:registerEvent name="deleteSalesItem" type="c:LtngSPAreaMaterialsEvt"/><aura:registerEvent name="editCustomerItem" type="c:LtngSPAreaMaterialsEvt"/><div class="item-container"><lightning:layout verticalAlign="center"><lightning:layoutitem size="1" padding="around-small"><ui:inputCheckbox/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:select label="Areas" aura:id="chooseAreas"name="chooseAreas" variant="label-hidden" class="slds-size_xx-small"><option value="{!v.salesMessage.country}" selected="selected">{!v.salesMessage.Area__c}</option></lightning:select></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:select label="Countries" aura:id="chooseCountries"name="chooseCountries" variant="label-hidden" class="slds-size_xx-small"><option value="{!v.salesMessage.country}" selected="selected">{!v.salesMessage.Country__c}</option></lightning:select></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:formattedNumber value="{!v.salesMessage.Project_Sales_Engineer_CN__c /100}" style="percent" maximumFractionDigits="3"/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:formattedNumber value="{!v.salesMessage.Project_Sales_Engineer_FN__c /100}" style="percent" maximumFractionDigits="3"/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:formattedNumber value="{!v.salesMessage.Channel_Sales_Engineer_CN__c /100}" style="percent" maximumFractionDigits="3"/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:formattedNumber value="{!v.salesMessage.Channel_Sales_Engineer_FN__c /100}" style="percent" maximumFractionDigits="3"/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small"><lightning:formattedNumber value="{!v.salesMessage.Country_Representatives__c/100}" style="percent" maximumFractionDigits="3"/></lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">{!v.salesMessage.Valid_From__c}</lightning:layoutitem><lightning:layoutitem size="1" padding="around-small">{!v.salesMessage.Valid_To__c}</lightning:layoutitem><lightning:layoutitem size="2" padding="around-small"><lightning:buttonIcon iconName="utility:edit" onclick="{!c.doEdit}"/><lightning:buttonIcon iconName="utility:delete" onclick="{!c.doDelete}"/></lightning:layoutitem></lightning:layout></div>
</aura:component>

 

父的另一个子的controller:

 

/*** Created by zhezhana on 9/25/2018.*/
({doDelete : function (component, event, helper) {console.log("doDelete!!");var salesMessage = component.get("v.salesMessage");var deleteSales = component.getEvent('deleteSalesItem');deleteSales.setParams({"salesId" : salesMessage.id});deleteSales.fire();console.log("fire!!");},doEdit : function (component, event, helper) {var editEvt = component.getEvent("editCustomerItem");editEvt.setParams({message : component.get("v.salesMessage")});editEvt.fire();}
})


SOQL查询picklist的value::

select id,toLabel(Area__c),toLabel(Country__c)
from Sales_Bargaining_Range__c


http://chatgpt.dhexx.cn/article/Pxtjx65O.shtml

相关文章

什么是CPQ?以及为什么选择Salesforce?

你和你的销售团队希望更快的赢得交易&#xff0c;这是你使用Salesforce的一个原因。这也是一个很好的理由花时间学习CPQ的原因&#xff0c;在这里你会了解Salesforce CPQ&#xff0c;这是一个原生的Salesforce应用程序&#xff08;在Force.com平台上开发的CPQ产品&#xff0c;后…

【数字化销售】CPQ软件概述

什么是CPQ软件&#xff1f; 配置、定价、报价&#xff08;CPQ&#xff09;软件是一种销售加速软件&#xff0c;主要用于生成报价和管理产品配置请求。这简化了销售活动&#xff0c;为客户提供了快速和准确的定价信息&#xff0c;根据他们的需要。 该软件根据一组定义的规则自动…

什么是面包屑导航?

面包屑导航用来辅助主导航&#xff0c;一般在页面的上方。 例子: 苹果使用面包屑导航辅助展示主导航

面包板是神马东西?。。

面包板是创客硬件布置电路非常常用的器件&#xff0c;它可以看做是一个很大的电路板&#xff0c;只不过这个电路板不需要焊接&#xff0c;只需要将元器件插在面包板上就可以了&#xff0c;非常方便&#xff0c;也降低了硬件设计的难度&#xff1b;至于为什么叫面包板&#xff0…

庞加莱买面包的故事(一)

亨利庞加莱 (JulesHenri Poincar)是法国数学家、天体力学家、数学物理学家、科学哲学家&#xff0c;1854年4月29日生于法国南锡&#xff0c;1912年7月17日卒于巴黎。庞加莱的研究涉及数论、代数学、几何学、拓扑学、天体力学、数学物理、多复变函数论、科学哲学等许多领域。 提…

面包板

也许面包板是电路初学者用来搭建电路的最基础的工具了。那么为什么它们被称为面包板&#xff1f;它的基本原理是什么呢&#xff1f; ▲ 面包板内部的结构 01历史 如果你在上个世纪六十年代之前想搭建电路的话&#xff0c;你最有可能使用技术就是使用一种被称为绕线连接(Wire-…

不只是包子铺!巴比食品:重回高增长赛道,做中式面点第一品牌

2020年10月&#xff0c;资本市场再现草根逆袭传奇股票&#xff0c;刚上市便连续斩获11个涨停板&#xff0c;市值暴增超86亿元。背后创始人刘会平仅初中学历&#xff0c;用二十余年时间&#xff0c;通过卖包子&#xff0c;将当时的个人财富从负债4000元变成坐拥70亿。 这家企业便…

如何实现带动画的动态面包屑,来看看?

大家好&#xff0c;我是派大星&#xff0c;最近在自己手动搭建一个后台管理平台&#xff0c;将其命名为 “雷达行动 Radar-Solution” &#xff0c;在开发的过程中对比了一下其他已经成型的后台解决方案&#xff0c;发现都存在一个共性&#xff0c;就是在Layout的头部都有一个面…

聊聊面包板

也许面包板是电路初学者用来搭建电路的最基础的工具了。那么为什么它们被称为面包板&#xff1f;它的基本原理是什么呢&#xff1f; ▲ 面包板内部的结构 01历史 如果你在上个世纪六十年代之前想搭建电路的话&#xff0c;你最有可能使用技术就是使用一种被称为绕线连接(Wire-Wr…

你真的会用面包屑导航吗?

面包屑导航是一个次级导航系统&#xff0c;可以展示用户在网站或应用中的位置。这个术语来源于童话《糖果屋》&#xff0c;故事中的主人公在森林里用面包屑做标记来防止迷路。 类似于故事里的主人公&#xff0c;用户需要知道他们在网站层级结构中的位置以便于他们访问上一级网页…

一片面包引起的谬论

网上流传这么一个说法&#xff1a;为了你和你的家人&#xff0c;请不要再吃面包了。 骤眼看去觉得似乎有道理&#xff0c;但按大多数人的常识&#xff0c;显而意见这说法就是不科学&#xff0c;但哪里出问题了呢&#xff1f;最近看了《统计数字会说慌》&#xff0c;借此分析下这…

面包屑的设计

一、什么是面包屑 A “breadcrumb” &#xff08;or “breadcrumb trail”&#xff09; is a type of secondary navigation scheme that reveals the user’s location in a website or Web application. The term comes from the Hansel and Gretel fairy tale in which the…

面包是重要的

面包会有的&#xff0c;但是现在吃什么&#xff1f;我不是一个会画饼的&#xff0c;而且我想即使是很会画饼的&#xff0c;也要尽快拿出个饼来&#xff0c;至少是一个窝头&#xff0c;否则也没人会等。小企业真的很难办&#xff0c;如果拿出个皮萨出来&#xff0c;员工会很高兴…

面包屑导航

面包屑导航 前言饿了吗蚂蚁正文总体代码代码解释设置行设置ul 样式设置分隔符设置超链接样式 总结 前言 什么是面包屑导航&#xff1f;我们来看看饿了吗和蚂蚁的面包屑组件 饿了吗 蚂蚁 看了如上两个案例&#xff0c;大家对于面包屑导航应该就有概念了。那么在不使用任何前端…

chrony服务部署详解

两台机器 a: 第一台机器从阿里云同步时间 第二台机器从第一台机器同步时间 1、查看chrony是否安装&#xff0c;如果没有&#xff0c;先安装 yum -y install chrony 2、查看chroncy服务的状态&#xff0c;如果关闭&#xff0c;先开启,并且设置开机自启动 systemctl status …

[Linux系列]Chrony时间同步服务器

背景 前面在做LNMP和LNMT架构的实验时&#xff0c;虚拟机待机一晚上之后&#xff0c;时间还停留在前一天&#xff0c;从而导致apt命令无法安装应用。又让我想起了前段时间在做某国产xc项目的时候&#xff0c;就出现过内网xc主机&#xff0c;关机一段时间之后&#xff0c;时间不…

时间同步设置NTP和Chrony两种方式—— 筑梦之路

之前写的&#xff1a;Chrony时间同步服务器的搭建——筑梦之路_筑梦之路的博客-CSDN博客_搭建chrony服务器 linux 下部署NTP服务器 时间同步_筑梦之路的博客-CSDN博客 操作系统&#xff1a;centos7NTP 方式#作为客户端&#xff0c;同步公网的时间服务器 # 安装ntp服务 yum -y…

两分搞定chrony时间服务同步

一、chrony服务器 Chrony 是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计 算机保持系统时钟与时钟服务器&#xff08; NTP &#xff09;同步&#xff0c;因此让你的计算机保持精确的时 间&#xff0c; Chrony 也可以作为服务端软件为其他计算机提供…

使用Chrony同步时间

1、 安装 yum -y install chrony #默认系统已安装2、 启动自启 systemctl enable --now chronyd3、 添加同步时间服务器 vim /etc/chrony.conf ntp.aliyun.com#保存重启chronyd systemctl restart chronyd4、 查看网络同步时间是否开启 timedatectl5、还有一个关键的信息&…

Linux 通过Chrony实现NTP

Linux实现NTP服务器时间同步&#xff0c;可以通过ntp服务实现&#xff0c;也可以通过chrony服务实现 两者区别主要有 Chrony运行于UDP的323端口&#xff0c;NTP运行于UDP的123端口 Chrony相比于NTP可以更快同步&#xff0c;能够最大同步的减少时间和频率的误差 Chrony能够更好…