// In helper
callServerAction : function(component, action) {
return new Promise(function(resolve, reject) {
action.setCallback(this, function(response) {
let _state = response.getState();
if (_state === "SUCCESS") {
resolve(response.getReturnValue());
} else {
let errors = response.getError();
let message = "Error";
if (errors && Array.isArray(errors) && errors.length > 0) {
message = JSON.stringify(errors);
}
reject(new Error(message));
}
});
$A.enqueueAction(action);
});
},
// In Controller
doMethod : function(component, event, helper) {
let myAction = component.get("c.doSomething");
myAction.setParams({
"param1": param1
});
let myAcitonPromise = helper.callServerAction(component, myAction);
myAcitonPromise.then(function(_returnValue) {
// DO SOMETHINT OR CONTINUE PROMISE
}).catch(function(_error) {
console.error(_error);
}).finally(function() {
});
}
月度归档: 2020 年 10 月
Aura中Javascript版的String.replace()
作为Java的高度定制豪华版,Apex的String对象提供了三个与字符串替换相关的函数,replace(), replaceAll(), replaceFirst()。其中replace负责用字符串进行替换,replaceAll()负责用正则表达式进行替换,replaceFisrt负责用正则表达式替换第一个匹配到的结果。
在Apex范畴,这三个方法已经足够日常使用。但是在Javascript领域状况有所不同。
在Javascript中也有个函数叫做replace(),但却复杂很多。
首先引用来自官方文档的例子
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
const regex = /dog/gi;
console.log(p.replace(regex, 'ferret'));
// expected output: "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"
console.log(p.replace('dog', 'monkey'));
// expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"
Javascipt的replace同时支持字符串替换与正则表达式替换,并且支持特殊替换符等高级功能。
但是,此replace却非彼replace。
Apex的replace使用字符串替模式会更加直白一些,直接使用 a.replace(b,c); 就能将a中的b替换成c,注意,是所有的b都被替换c。
而Javascript的字符串替换模式则仅替换第一个匹配项。与Apex的replaceFirst方法效果等同。
这样的话,在Lightning Component中如果打算实现与Apex中的replace一样的效果,就需要启用正则表达式模式。
在Helper添加如下方法:
replace : function(content, reg, replacement, isCaseSensitive) {
let mode = 'g';
if(!isCaseSensitive) {
mode = mode + 'i';
}
let re = new RegExp(reg, mode);
if(content !== null && content !== undefined && content !== "") {
content = content.replace(re, replacement);
}
return content;
}
虽然无法像原生方法一样直接写成a.replace(b,c); 但好在仍然是一行代码调用。
init : function(component, event, helper) {
const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?';
const reg = 'Dog';
const replacement = 'ferret';
let result = helper.replace(p, reg, replacement);
console.log('result', result);
// result The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?
}
如果需要打开大小写敏感模式,则直接增加第四个参数 helper.replace(p, reg, replacement, true); 即可。
Winter’21升级导致Aura的createRecordEvent中Datetime赋值行为变化
众所周知,Winter‘21在发布此文时已经正式上线。
其中,由于对Aura中使用Apex的权限采取了更严格的标准,从而导致了大批功能崩溃的惨剧。
除此之外,还有另一个Aura的底层变化也值得注意。
在最新的文档中,force:createRecord这个event的文档下面增加了一行小字
Date and time field values must use the ISO 8601 format. For example:
Date: 2017-07-18
Datetime: 2017-07-18T03:00:00Z
While the create record panel presents datetime values in the user’s local time, you must convert datetime values to UTC to prepopulate the field.
这就导致了原来直接向Datatime字段赋值Date值的功能报错。
let createRecordEvent = $A.get("e.force:createRecord");
createRecordEvent .setParams({
"entityApiName": "A__c",
"defaultFieldValues": {
'testDatetime__c' : '2020-10-21'
}
});
createRecordEvent .fire();
// Error on Save : Value for field 'testDatetime__c' is not in ISO 8601 format, Value: 2020-10-21, Runtime class: java.lang.String
保存数据时会报如下错误

Error: Value for field ‘testDatetime__c’ is not in ISO 8601 format, Value: 2020-10-21, Runtime class: java.lang.String
如果有需要把date值写入datetime型字段的同学,可以在helper添加如下方法为date值填充时分秒,以此伪装成datatime值。
// in helper
paddingTime : function(date) {
if(date != "" && date != null && date != undefined && date != {}) {
date = date + "T00:00:00.000";
}
return date;
}
// in controller
init : function(component, event, helper) {
let createRecordEvent = $A.get("e.force:createRecord");
createRecordEvent .setParams({
"entityApiName": "A__c",
"defaultFieldValues": {
'testDatetime__c' : helper.paddingTime('2020-10-21')
}
});
createRecordEvent .fire();
}
另外需要值得注意的是,虽然aura的controller看起来是前端,但实际上createRecord事件的日期时间赋值行为等同于Apex————既作为UTC时间插入数据库,需要考虑显示时差问题。
那么相比之下,有同学会产生疑问,Apex受影响吗? 还能愉快的直接将date值写入datetime型字段吗?
答案是,放心,Apex一如既往。
// 后记
其实我并不确定官方文档里关于时期格式的描述一定是Winter’21后才加的,但是很确定Winter’21之前可以直接把date值赋给datetime型字段。毕竟aura event的文档无法查看历史版本,所以,就让我主观的视其为Winter’21吧。