重写新建/更新按钮的原因是因为项目需要用户在新建数据时从接口对数据进行校验,保证数据的有效性,同时获取接口返回的部分数据完成信息填充,而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. Vue.js 源码分析(二十五) 高级应用 插槽 详解

    我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...

  2. redis命令之 ----List(列表)

    BLPOP BRPOP BRPOPLPUSH LINDEX LINDEX key index 返回列表 key 中,下标为 index 的元素. 下标(index)参数 start 和 stop 都以 ...

  3. 转载一篇文章:LINQ TO SQL 大全

    https://www.cnblogs.com/chenwolong/p/lts.html 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河 ...

  4. Java面向对象——相关基本定义

    Java面向对象——相关基本定义 摘要:本文简单介绍了面向对象的编程方式,以及与之有关的一些基本定义. 面向对象 什么是面向对象 面向对象编程是一种对现实世界建立计算机模型的一种编程方法.简称OOP( ...

  5. MES助力日立电梯提升精细化管理水平

    项目背景介绍 日立电梯在2008年到2012年期间分别在五地工厂(上海.广州.天津.成都.扶梯)上线了ERP系统,在后续的使用时间里,逐渐发现现有ERP系统对于生产现场管理,产品质量追溯,产能控制等方 ...

  6. 对cell每一行做标记

    通过数组进行标记 初始化列表的时候给一个值如 for (int i = 0; i < [self.tableData count]; i++)    {        [_allOrderBoo ...

  7. AccessCenter 模块结构

    AccessCenter 模块结构

  8. Python元组与字符串操作(10)——冒泡法

    冒泡法 属于交换排序,元素两两比较大小,交换位置,结果可升序或降序排列 nums = [2,5,1,6,7,9,8,3,4] for i in range(len(nums)): ##计数器0~8 f ...

  9. conan使用(一)--安装和应用

    1. 安装conan 使用pip命令安装conan,如果没有安装pip的,可以先安装好python后,再安装pip. pip install conan 之后就可以使用conan命令. 2. 管理远程 ...

  10. linux (08) nginx入门详解

    一. nginx 入门 nginx 入门学习 web服务器软件 windows IIS服务器 linux nginx apache 收费​lighthttp 公司的技术栈 收费版技术栈 apache ...