动态设置运行时元数据上数值类型控件限定范围的示例原创
3人赞赏了该文章
463次浏览
编辑于2023年01月18日 11:26:07
【场景】
计划管理应用中进行任务汇报进度时,当前汇报进度不能小于上一次汇报进度;
【解决方案】
【方案一】用户输入值后失去光标时,进行Tips提示校验;
优点:可自定义提示信息,操作异常更明确
缺点:代码实现逻辑复杂,校验不通过时需要代码还原旧值
【代码示例】在propertyChanged方法中
DynamicObject task = model.getDynamicObject(ProgressReportConstant.Task); if(task != null) { //获取最新的汇报记录 DynamicObject latestReportRecord = this.getLatestTaskReportRecord(task.getPkValue()); if (latestReportRecord != null) { //获取最新汇报记录中的汇报进度 String minValue = latestReportRecord.getString(TaskConstant.Percent); BigDecimal percentNewValue = new BigDecimal(newValue.toString()); BigDecimal percentOldValue = new BigDecimal(minValue).setScale(percentNewValue.scale(), RoundingMode.HALF_UP); if (percentNewValue.compareTo(percentOldValue) < 0) { this.getView().showErrorNotification(String.format("当前汇报进度%s%%不能小于完成进度%s%%。" percentNewValue, percentOldValue)); this.getModel().beginInit(); this.getModel().setValue(ProgressReportConstant.Percent, percentOldValue); this.getModel().endInit(); return; } } }
【方案二】用户输入时仅做元数据上的限定范围设置的校验,最终在保存、提交操作时做字段值合规性校验;
优点:使用了平台默认操作时字段值合规性校验
缺点:交互体验不好,校验不通过时,不会还原到旧值
【代码示例】在afterBindData方法中
//获取最新的汇报记录 DynamicObject latestReportRecord = this.getLatestTaskReportRecord(taskIdValue); if (latestReportRecord != null) { //获取最新汇报记录中的汇报进度 String minValue = latestReportRecord.getString(TaskConstant.Percent); if (minValue != null) { DecimalProp decimalProp = ((DecimalProp) ((DecimalEdit) this.getControl("percent")).getProperty()); String dataScope = String.format("[%s,%s]", minValue, decimalProp.getMax()); decimalProp.setDataScope(dataScope); decimalProp.setMin(new BigDecimal(minValue)); } }
【方案三】用户输入前重新设置元数据的限定范围并更新到前端,输入数据时实时进行限定范围提示;
优点:使用了平台默认的前端字段值合规性校验
缺点:无
【代码示例】在afterBindData方法中
//获取最新的汇报记录 DynamicObject latestReportRecord = this.getLatestTaskReportRecord(taskIdValue); if (latestReportRecord != null) { //获取最新汇报记录中的汇报进度 String minValue = latestReportRecord.getString(TaskConstant.Percent); Map<String, Object> items = new HashMap<>(1); items.put(ClientProperties.MinValue, minValue); Map<String, Object> params = new HashMap<>(1); params.put("item", items); this.getView().updateControlMetadata(ProgressReportConstant.Percent, params); }
【注意】设置前端控件属性时,建议使用常量类kd.bos.form.ClientProperties
赞 3
3人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读
您的鼓励与嘉奖将成为创作者们前进的动力,如果觉得本文还不错,可以给予作者创作打赏哦!
请选择打赏金币数 *
10金币20金币30金币40金币50金币60金币
可用金币: 0