xp上的必需属性:inputText阻止其他控件上的计算呈现属性

时间:2017-05-02 09:12:17

标签: java xpages

在我的XPage中,我计算了一些控件的渲染属性,例如

<xp:panel rendered="#{employeeBean.senior}"></xp:panel>

我在控件上添加了属性

required="true" 

这些渲染的属性不再有效,除非我提交文档并验证表格。

当我根据此处提供的指南应用自定义formvalidator时:

adding validation to my save method

渲染的属性按预期工作。

我的问题是:

  • 为什么默认要求= true属性&#34;阻止&#34;我呈现的比例? -
  • 我该怎样防止这种情况?
  • 如何将所需属性与计算出的渲染属性一起使用,因为这样可以节省时间?

1 个答案:

答案 0 :(得分:0)

required="true"不应该阻止渲染的属性工作。但是,它将阻止正常的部分刷新生命周期完成,因此会更新数据模型。正常的部分刷新生命周期通过流程验证(阶段3)运行,该流程验证运行所有转换器和验证器,以确保在浏览器中输入的文本值的有效性(并在Apply Request Values阶段传递给组件的submittedValue属性,阶段2)。如果任何组件失败,则部分刷新生命周期会立即跳至渲染响应,第六个和最后一个阶段,将验证错误返回到浏览器以显示在显示错误/显示错误组件中(因此始终将其包含在刷新区域中) )。它从不运行更新模型值阶段(阶段4),它将值传递给每个组件的value属性,现在它们已经过验证并确认它们可以转换为它们要存储的任何基础数据类型如。它永远不会运行运行Java / SSJS的Invoke Application(第5阶段)。

您的呈现属性指向一个仍然具有最后有效输入值的Java变量。

在部分刷新时,可以使用disableValidators="true"(“未经验证的流程数据”)跳过验证,并更新数据模型。如果存在转换错误(例如,在数字字段中输入“One”),它仍然会失败,因为用该值更新数据模型会破坏所有内容。

将验证放在保存按钮中,因为验证在每次部分刷新期间都没有运行,只是在保存期间。这就是为什么我通常更喜欢这个选项。

如果您的Java bean通常扩展Map接口,这是一个易于强制字段的选项。如果bean中有另一个属性,其中键映射到必需属性,并且值映射到显示标签,则可以在保存的验证例程中使用该属性。如果bean扩展了Map,你可以调用:

for (String propName : requiredProperties.keySet()) {
  if (StringUtil.isEmpty(get(propName)) {
    // throw error message using FacesMessage, possibly try to invalidate component as well
  }
}

有关刷新生命周期的更多信息,我的Slideshare会议上有各种各样的会议,我已经讨论了这个问题,去年还有TLCC webinar,“Marty,你只是不思考第四维“。