文本框旁占位符图标无法实时显示客户姓名首字母求助
问题分析
- 事件触发时机与数据不同步:
change事件触发时,ComboBox的store可能还未完成选中项的同步,导致findRecordByValue无法正确获取对应record,进而无法生成首字母。 - 逻辑缺陷:
SetPoponFieldCustomDisplay处理poponfield类型时,直接取store第一个item的TEXT,完全不符合选中特定客户的业务场景。 - 冗余查找:
poponfieldInfoFeature中已拿到选中的record,却在SetPoponFieldCustomDisplay中重复执行查找逻辑,既浪费性能又增加出错概率。
修复方案
1. 优化poponfieldInfoFeature事件处理函数
直接利用已获取的record传递客户名称,避免二次查找:
var poponfieldInfoFeature = function (field, oldValue, newValue, opt) { var poponfield = field.up('fieldcontainer'); var infoButton = poponfield.down('button[itemId=info]'); if (infoButton) { var fieldValue = field.getValue(); var record = field.findRecordByValue(fieldValue); if (record && record.get('REF')) { if (acpV9 && field.ACPUserDisplay) { // 直接传递选中record的TEXT字段 SetPoponFieldCustomDisplay(infoButton, null, record.get('TEXT')); } infoButton.setDisabled(false); } else { if (acpV9 && field.ACPUserDisplay) infoButton.setText(''); infoButton.setDisabled(true); } } }
2. 修正SetPoponFieldCustomDisplay逻辑
移除错误的store元素获取逻辑,直接基于传入的客户名称处理首字母:
var SetPoponFieldCustomDisplay = function (currentbtn, ept, fieldValue) { var poponText = fieldValue || ''; if (poponText !== '' && poponText !== null) { var matches = poponText.match(/\b(\w)/g); var acronym = matches ? matches.join('') : ''; acronym = acronym.length > 2 ? acronym.charAt(0) + acronym.charAt(acronym.length - 1) : acronym; currentbtn.setText(acronym.toLowerCase()); } else { currentbtn.setText(''); } }
3. 可选:改用select事件提升实时性
若change事件仍存在延迟问题,可替换为select事件(选中项后立即触发):
修改C#事件绑定代码:
// 将原change事件替换为select事件 poponField.listeners = (ComboBoxListeners)AddListenersToComponent(poponField.listeners, Helper.GetInstance().GenerateGenericListener("poponfieldInfoFeature" , Constant.extJsEventPameters["fieldSelect"], null, false), "select", new ComboBoxListeners());
适配select事件的处理函数:
var poponfieldInfoFeature = function (field, records, opt) { var poponfield = field.up('fieldcontainer'); var infoButton = poponfield.down('button[itemId=info]'); if (infoButton && records.length > 0) { var record = records[0]; if (record && record.get('REF')) { if (acpV9 && field.ACPUserDisplay) { SetPoponFieldCustomDisplay(infoButton, null, record.get('TEXT')); } infoButton.setDisabled(false); } else { if (acpV9 && field.ACPUserDisplay) infoButton.setText(''); infoButton.setDisabled(true); } } else { if (acpV9 && field.ACPUserDisplay) infoButton.setText(''); infoButton.setDisabled(true); } }
内容的提问来源于stack exchange,提问作者Aryan Mehta
相关产品推荐
相关产品推荐

