Apache Isis表单UI元素条件渲染实现咨询(新手提问)
Apache Isis 动态表单条件渲染实现方案
嘿,作为Apache Isis开发者,我正好处理过不少这类动态表单的场景,给你分享下完全贴合你需求的实现步骤——针对年龄分支显示不同问题的逻辑,用Isis内置的特性就能搞定,不用额外折腾复杂插件:
1. 先搭好表单的核心实体(视图模型)
因为是表单业务,不需要持久化到数据库,所以用**视图模型(View Model)**来承载数据最适合。先把所有需要的字段都定义好,默认把后续分支的字段隐藏,之后再用逻辑控制显示:
import org.apache.isis.applib.annotation.*; @DomainObject(nature = Nature.VIEW_MODEL) public class AgeDependentForm { // 基础年龄字段 private Integer age; @Property @PropertyLayout(named = "您的年龄是多少?") public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } // 18+显示的投票问题 private Boolean votedInLastElection; @Property @PropertyLayout( named = "您在上次选举中投票了吗?", hidden = Where.EVERYWHERE, // 默认全场景隐藏 hiddenReason = "仅年龄大于18岁时可见" ) public Boolean getVotedInLastElection() { return votedInLastElection; } public void setVotedInLastElection(Boolean votedInLastElection) { this.votedInLastElection = votedInLastElection; } // 18-显示的工作/学习问题 private String workOrStudyStatus; @Property @PropertyLayout( named = "您正在工作还是学习?", hidden = Where.EVERYWHERE, hiddenReason = "仅年龄小于18岁时可见" ) public String getWorkOrStudyStatus() { return workOrStudyStatus; } public void setWorkOrStudyStatus(String workOrStudyStatus) { this.workOrStudyStatus = workOrStudyStatus; } // 核心:控制字段显示的逻辑方法 @Programmatic // 标记为内部方法,不会在UI上显示成按钮 public boolean isVotedInLastElectionVisible() { // 先判断年龄不为空,避免空指针 return getAge() != null && getAge() > 18; } @Programmatic public boolean isWorkOrStudyStatusVisible() { return getAge() != null && getAge() < 18; } }
2. 让UI跟着逻辑走
Isis会自动识别is[PropertyName]Visible()格式的方法,作为对应字段的显示条件。只需要给分支字段加上visibility = Visibility.EDEMA,告诉Isis用我们的自定义逻辑来控制显示:
修改投票问题的注解:
@PropertyLayout( named = "您在上次选举中投票了吗?", hidden = Where.EVERYWHERE, hiddenReason = "仅年龄大于18岁时可见", visibility = Visibility.EDEMA // 启用动态可见性判断 )
同样给工作/学习字段加上这个属性就行。
3. 进阶优化:实时刷新+复杂逻辑
- 实时刷新:如果不想让用户点击保存才看到字段变化,给年龄字段加上
@PropertyLayout(ajax = true),输入年龄后UI会立刻自动刷新,体验更流畅。 - 复杂业务逻辑:如果你的条件判断需要调用外部服务或者读取配置,可以把逻辑抽到领域服务里,比如:
@DomainService(nature = NatureOfService.DOMAIN) public class FormVisibilityService { public boolean shouldShowVotingQuestion(AgeDependentForm form) { // 这里可以加复杂逻辑,比如从数据库读取选举年龄限制 return form.getAge() != null && form.getAge() > 18; } public boolean shouldShowWorkStudyQuestion(AgeDependentForm form) { return form.getAge() != null && form.getAge() < 18; } }
然后在表单实体里注入这个服务,修改显示逻辑方法:
@Inject FormVisibilityService visibilityService; @Programmatic public boolean isVotedInLastElectionVisible() { return visibilityService.shouldShowVotingQuestion(this); }
踩过的坑提醒
- 一定要给判断逻辑加上
getAge() != null的判断,不然用户还没输入年龄时会报空指针。 - 1.x版本的Isis可能需要用
@Hidden(when=...)代替visibility属性,核心逻辑还是一样的。
内容的提问来源于stack exchange,提问作者Tumaini Kilimba
相关产品推荐
相关产品推荐

