重写新建/更新按钮的原因是因为项目需要用户在新建数据时从接口对数据进行校验,保证数据的有效性,同时获取接口返回的部分数据完成信息填充,而Sales force的trigger仅支持@future方法异步调用接口,不能实时完成数据校验

那么重写新建/更新按钮要面临的几个核心问题:

1、lightning暂时不支持lookup字段,如果重写可能要自定义组件

2、lightning新建按钮,怎么重写在项目下新建时自动填充的父对象

点击对象管理器,新建对象项目(Test_Project),部门(Test_Department)

以下是部门(Test_Department)的字段表

标签 API 数据类型
部门名称 Name 文本(80)  
项目 Project_Dep__c 查找(项目)  
角色 Role__c 选项列表

项目经理

项目顾问

项目开发

项目测试

邮箱 Email__c 电子邮件  
报表权限 Report_Access__c 复选框  
描述 Remarks__c 文本区(255)  

先创建一个lightning组件Test_NewDepartment

<aura:component implements="lightning:actionOverride,
                 flexipage:availableForRecordHome,
                 force:hasRecordId,
                 flexipage:availableForAllPageTypes"
access="global"
description="Test_NewDepartment">
</aura:component>

组件继承的几个接口说明下

lightning:actionOverride:继承该接口才能覆盖标准按钮

force:hasRecordId:继承该接口才能通过“v.recordId"获取当前页面的记录ID

然后来处理第一个问题,lightning暂时不支持lookup字段的问题

经过了解,lightning提供了一个<lightning:recordEditForm>组件,通过<lightning:inputField>可以操作查找字段.

<aura:component implements="lightning:actionOverride,
                 flexipage:availableForRecordHome,
                 force:hasRecordId,
                 flexipage:availableForAllPageTypes"
access="global"
description="Test_NewDepartment">
  <!-- 部门 -->
<aura:attribute name="simpleDepartmentRecord" type="Test_Department__c" default="{'SobjectType':'Test_Department__c'}"/>
  <!-- 错误消息-->
<aura:attribute name="recordError" type="String"/>
  <!-- 标记按钮能否点击-->
<aura:attribute name="flag" type="Boolean" default="true"/> <div aura:id="editDialog" role="dialog" tabindex="-1" aria-labelledby="header43" class="slds-modal slds-fade-in-open">
<div class="slds-modal__container">
<div class="slds-modal__header">
<h2 class="slds-text-heading--medium">{!(v.recordId == null?'新增':'更新') + '部门'}</h2>
</div>
<lightning:messages />
<lightning:recordEditForm objectApiName="Test_Department__c">
<div class="slds-modal__content slds-p-around--medium slds-wrap" >
<lightning:input aura:id="departmentId"
label="用户名"
name="userName"
placeholder="请输入完整的用户名"
required="true"
value="{!v.simpleDepartmentRecord.Name}" />
<lightning:inputField class="customRequired"
aura:id="roleId"
fieldName="Role__c"
value="{!v.simpleDepartmentRecord.Role__c}"/>
<lightning:inputField class="customRequired"
fieldName="Email__c"
value="{!v.simpleDepartmentRecord.Email__c}"/>
<lightning:inputField class="customRequired"
aura:id="projectLookupId"
fieldName="Project_Dep__c"
value="{!v.simpleDepartmentRecord.Project_Dep__c}"/>
<lightning:inputField class="customRequired"
aura:id="reportId"
fieldName="Report_Access__c"
value="{!v.simpleDepartmentRecord.Report_Access__c}"/>
<lightning:inputField fieldName="Remarks__c"
value="{!v.simpleDepartmentRecord.Remarks__c}"/>
</div> <div class="slds-modal__footer">
<lightning:button variant="neutral" label="Cancel" onclick="{!c.cancelDialog}" />
<lightning:button variant="brand" label="Submit" onclick="{!c.saveRecord}" disabled="{!v.flag}"/>
</div>
</lightning:recordEditForm>
</div>
</div>
  <!-- 弹窗打开的时候,用一个遮罩层将页面变暗-->
  <div aura:id="overlay" class="slds-backdrop slds-backdrop--open"></div>
</aura:component>

此时预览下页面查看效果

通过<lightning:recordEditForm>组件,就能比较方便的重写新建/更新按钮,但此时会出现一个问题

当点击更新按钮的时候,会发现使用<lightning:input>的用户名没有办法进行更新,此时查阅相关文档

<Lightning:recordEditForm> 发现这样一句话:

The lightning:inputField component is used inside the lightning:recordEditForm to create editable fields. 
The lightning:outputField component and other display components such as lightning:formattedName can be used to
display read-only information in your form.

简单说,除了使用<lightning:inputField>的字段是可编辑的,lightning:input,lightning:formattedName等其他标签都是只读的

于是这里就遇到一个很严重的问题,查阅文档知道lightning:inputField字段不支持onblur属性,它支持onchange属性,而需求是在输入用户名后通过接口实时对输入的数据进行校验并获取返回的用户ID.

直接操作看起来不太可行,于是想到了迂回解决的办法,把更新也当作新建处理.

在点击更新的时候,将页面记录ID传到后台进行初始化,把查询出来的部门信息反向填充到表单中,这样就能绕开<lightning:recordEditForm>更新时lightning:input无法编辑,而lightning:inputField又不支持onblur属性的问题.

PS:
此处补充一个<lightning:recordEditForm>组件的小问题,<lightning:recordEditForm>在提交按钮
<lightning:button variant="brand" label="Submit" onclick="{!c.saveRecord}" type="submit"/>
会有一个默认的提交行为,所以不小心就会出现提交两次的问题,此时在JSController提交方法中设置 // 取消默认的提交行为
event.preventDefault();
就能取消组件的默认提交行为,以下是文档的描述
To customize the behavior of your form when it loads or when data is submitted, use the onload and onsubmit attributes
to specify event handlers. If you capture the submit event and submit the form programmatically,
use event.preventDefault() to cancel the default behavior of the event. This prevents a duplicate form submission.

接下来处理第二个问题:在父对象项目的相关列表中创建部门对象时,如何自动填充父对象的问题.

很遗憾, Salesforce没有提供类似v.recordId这样的属性可以直接获取父级id,甚至在查阅解决方案的时候发现有人提了Idea

后来有个想法就是说不管怎么设计,相关列表创建子对象记录一定绕不开的就是通过url传递父对象的ID

所以在组件的Helper.js中写一个解析URL的方法

//  获取URL参数
getUrlParameter : function(component,event,name) {
name = name.replace(/[\[\]]/g, "\\$&");
var url = window.location.href;
var regex = new RegExp("[?&]" + name + "(=1\.([^&#]*)|&|#|$)");
var results = regex.exec(url);
if (!results) return null;
if (!results[2]) return '';
return decodeURIComponent(results[2].replace(/\+/g, " "));
}

在组件的Controller.js中打印父级ID

doInit : function(component, event, helper){
// 获取可能的父级id
var value = helper.getUrlParameter(component,event,'inContextOfRef');
var context = JSON.parse(window.atob(value));
var parentId = context.attributes.recordId;
console.log('*** parentId:' + parentId);
},

判断如果parentId存在,则将Id传递到后台,查询父对象的信息并返回数据进行填充

// 从父级对象创建部门的时候给对应的字段预填充
@AuraEnabled
public static String initFunction(String parentId){
System.debug('*** parentId:' + parentId); Test_Department__c permiss = new Test_Department__c();
// 考虑权部门以后除了项目还有其他的主表,这里要检验parentId属于那个对象
String prefix = Test_Project__c.sobjecttype.getDescribe().getKeyPrefix();
if (parentId.substring(0, 3) == prefix) {
permiss.Project_Dep__c = parentId;
}
System.debug('*** 部门:' + permiss);
return JSON.serialize(permiss);
}

填充效果如下

Salesforce Lightning开发学习(四)重写新建/更新按钮的更多相关文章

  1. Salesforce Lightning开发学习(一)Hello World开发实践

    一:什么是Lightning Component framework Lightning Component framework 简称Lightning,是Salesforce封装的一个前端框架,开发 ...

  2. Salesforce Lightning开发学习(二)Component组件开发实践

    lightning的组件区分标准组件.自定义组件和AppExchange组件.标准组件由SF提供,自定义组件由developer自行开发,AppExchange组件由合作伙伴建立.下面我们写一个简单的 ...

  3. Salesforce Lightning开发学习(三)Component表单初解

    初步了解了Lightning的组件开发流程后,我们来认识下lightning的表单 点击对象管理器,选择对象:电影(Movie__c),创建字段 标签 API 数据类型  票价  Number__c ...

  4. Java开发学习(四十一)----MyBatisPlus标准数据层(增删查改分页)开发

    一.标准CRUD使用 对于标准的CRUD功能都有哪些以及MyBatisPlus都提供了哪些方法可以使用呢? 我们先来看张图: 1.1 环境准备 这里用的环境就是Java开发学习(四十)----MyBa ...

  5. delphi开发学习四:TClientDataSet与TDataSetProvider控件使用实例

    1.TClientDataSet控件 通过TClientDataSet控件可以建立瘦客户端的应用程序,且数据执行效率较高,但它不能和数据库自动连接,程序中必须制定它如何获取数据.一般情况下,TClie ...

  6. Java开发学习(四)----bean的三种实例化方式

    一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下:    二. ...

  7. Excel开发学习笔记:新建文档级的excel解决方案

    工作中遇到一个数据处理自动化的问题,于是打算开发一个基于excel的小工具.在业余时间一边自学一边实践,最近终于完成了雏形.抽空把一些知识写下来以备今后参考,因为走的是盲人摸象的野路子,幼稚与错误请多 ...

  8. Java开发学习(四十)----MyBatisPlus入门案例与简介

    一.入门案例 MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发.提供效率. SpringBoot它能快速构建Spring开发环境用以整合其他技术,使用起来 ...

  9. JFinal Web开发学习(四)数据库连接与自动生成model

    1.新建数据库jfinal_test,user表 /* Navicat MySQL Data Transfer Source Server : . Source Server Version : 50 ...

随机推荐

  1. Spring笔记01

    spring 第一章 Spring模块规划图 核心架包 spring-beans-4.0.0.RELEASE. spring-core-4.0.0.RELEASE. spring-context-4. ...

  2. centos 7 防火墙相关操作

    centos 7 防火墙相关操作 CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙. 1.关闭firewall: systemctl stop firewal ...

  3. 腾讯WeTest加入智慧零售“倍增计划”,引领微信小程序质量优化

    WeTest 导读 在2019腾讯全球数字生态大会零售分论坛上,腾讯正式面向全行业合作伙伴发布倍增计划,通过咨询.培训.竞赛三步走,帮助零售商户解决前端触点融通的问题,推动微信生意大盘阶梯式上涨. 倍 ...

  4. RVZicsr指令集

    Riscv中每个硬件线程(hart)有4096个独立地址空间的状态寄存器.我们可以通过Zicsr指令读写csr寄存器.总共有6条csr读写指令,这些指令之前都在RV32I/RV64I基础指令集里面,在 ...

  5. 【转】合并两个List并去掉重复项

    原文:https://my.oschina.net/jack90john/blog/1493170 工作中很多时候需要用到合并两个List并去除其中的重复内容.这是一个很简单的操作,这里主要是记录一下 ...

  6. ERP WIP 部分API应用 详解

    工单创建 (create work order) PROCEDURE new_work_order(p_wip_entity_id NUMBER, p_organization_id NUMBER, ...

  7. 【微信错误】{"errcode":"40013","errmsg":"invalid appid hint: [mackRA06203114]","success":false}

    一.异常背景 发送可以跳转小程序的公众号模版消息 二.原因 当前公众号没有和被跳转的小程序关联 三.解决办法 去公众号平台将小程序和公众号进行关联就可以了

  8. 通过premake生成vs工程文件

    visual studio的工程视图,在引用外部目录时非常麻烦,这时候可以使用premake一键生成工程文件,自动配置好工程的各种属性,还有目录的组织结构. 示例:如下是一个c++的外部目录结构,我们 ...

  9. Invitation Cards POJ - 1511

    题目链接:https://vjudge.net/problem/POJ-1511 思路:题目意思就是,从1出发到所有城市,再从所有城市回到1的最短时间. 那么我们只要正跑一次图,然后反向存边,再跑一次 ...

  10. Spring Boot Quartz 动态配置,持久化

    Quartz 是一个很强大的任务调度框架在SpringBoot中也很容易集成 添加依赖: <dependency> <groupId>org.springframework&l ...