简体中文
triggerCalAndUIEvent
约 1124 字大约 4 分钟
2025-12-15
bizApi.triggerCalAndUIEvent(param)
触发UI事件和计算
参数
| 参数 | 说明 | 类型 | 是否必填 |
|---|---|---|---|
| masterData | 主对象数据 | Object | 否 |
| objApiName | 当前发起计算的对象 | String | 是 |
| details | 从对象数据 | Object | 否 |
| parseParam | 发起计算之前可以拦截请求参数,再次进行修改 | Function | 否 |
| skip | 当传true时会跳过UI事件 | Boolean | 否 |
| noMerge | 当传true时,底层不会合并计算回来的数据,一般不用传 | Boolean | 否 |
| dataIndex | 修改的从对象数据rowId,仅当发起计算的原因是因为修改了从对象数据 | Array | 当发起计算的原因是因为修改了从对象数据,必填 |
| newDataIndexs | 新加的从数据rowId | Array | 当发起计算的原因是因为添加了从对象数据,必填 |
| delDatas | 删除的从对象数据 | Array | 当发起的计算是因为删除了从对象数据,必填 |
| extraFields | 当底层分析出来的计算字段不满足业务,可通过它添加额外需要计算的字段:比如{SalesOrderObj: ['discount']} | Object | 否 |
| filterFields | 当需要对通用的计算字段进行过滤:比如{SalesOrderObj: ['discount']} | Object | 否 |
| changeFields | 此次计算是因为修改某些字段的值:比如['price','discount'] | Array | 当发起的计算是因为修改了某些字段的值,必填 |
| noRetry | 当计算失败时是否需要重试 | Boolean | 否 |
| loadingText | 计算过程中的提示文字 | String | 否 |
| noLoading | 计算过程中不显示loading,去掉可能会导致数据并发问题 | Boolean | 否 |
返回结果
Promise
基础示例
自定义按钮添加明细/删除明细/修改明细并发起计算
{
apply() {
return [{
event: 'md.render.before',
functional: this.mdRenderBefore.bind(this)
}]
}
mdRenderBefore(context, param) {
return {
buttons: {
add: [{
action: 'xxx_xx',//根据你的业务命名,需要保持唯一性
label: '添加一些从对象数据',
callBack() {
let newContext = param.api.pluginServiceFactory({
pluginApiName: 'xxx_xx_plugin',//根据业务命名,保持唯一性
objApiName: 'xxx',//替换为你的从对象apiname
recordType: 'xx'//替换为你的从对象业务类型
})
//此处演示添加的数据是异步获取的,这里假定你已经有了一个异步获取数据的方法: asyncGetDatas
//很多同学会问,那我是自定义弹框选数据呢?其实无论是弹框选数据,还是直接调接口,都属于asyncGetDatas的内部逻辑
//asyncGetDatas只是等待你完成取数据,至于怎么得到的数据不关心。
asyncGetDatas().then(datas => {//获取到数据
//这里有一个容易犯的错误,就是获取到数据之后,直接添加,对数据不做任何过滤,这是不对的
//因为你获取到的数据可能字段很多,根本不是当前从对象能接受的数据
//所以通常的做法就是
datas = datas.map(data => {
return {
object_describe_api_name: objApiName,
record_type: recordType,
name: data.name,
price: data.price
}
})
datas = newContext.dataUpdater.add(datas);//datas经过add之后会返回一个一个全新的datas供后续计算用
let newDataIndexs = [];
datas.forEach(data => newDataIndexs.push(data.rowId));
//最佳实践,添加完数据之后执行计算和事件
newContext.bizApi.triggerCalAndUIEvent({newDataIndexs}).then(rst => {
if(rst.statusCode) {//计算出现问题,说明当前添加的数据有问题
newContext.end(true);//true的作用告诉底层不要更新数据
} else {//没有错误时正常更新数据
newContext.end();
}
})
})
}
},{
action: 'xxx_edit',//根据你的业务命名,需要保持唯一性
label: '修改一些从对象数据',
callBack() {
let newContext = param.api.pluginServiceFactory({
pluginApiName: 'xxx_xx_plugin',//根据业务命名,保持唯一性
objApiName: 'xxx',//替换为你的从对象apiname
recordType: 'xx'//替换为你的从对象业务类型
})
//修改了rowId为123456/789012的数据
newContext.dataUpdater.updateData('xxx', '123456', {price: 100, discount: 100})
newContext.dataUpdater.updateData('xxx', '789012', {price: 300, discount: 200})
newContext.bizApi.triggerCalAndUIEvent({dataIndex: ['123456', '789012'],changeFields: ['price', 'discount']}).then(rst => {
if(rst.statusCode) {//计算出现问题,说明当前添加的数据有问题
newContext.end(true);//true的作用告诉底层不要更新数据
} else {//没有错误时正常更新数据
newContext.end();
}
})
}
}, {
action: 'xxx_del',//根据你的业务命名,需要保持唯一性
label: '删除一些从对象数据',
callBack() {
let newContext = param.api.pluginServiceFactory({
pluginApiName: 'xxx_xx_plugin',//根据业务命名,保持唯一性
objApiName: 'xxx',//替换为你的从对象apiname
recordType: 'xx'//替换为你的从对象业务类型
})
let delDatas = newContext.dataGetter.getDetail('xxx')//获取到需要删除的从对象数据
delDatas.forEach(data => {
newContext.dataUpdater.del('xxx', data.rowId)
})
newContext.bizApi.triggerCalAndUIEvent({delDatas: delDatas}).then(rst => {
if(rst.statusCode) {//计算出现问题,说明当前添加的数据有问题
newContext.end(true);//true的作用告诉底层不要更新数据
} else {//没有错误时正常更新数据
newContext.end();
}
})
}
}]
}
}
}
}