我有一个OpenUI5表单,包含许多Inputcontrols。这些Inputcontrols使用OpenUI5 DataBinding绑定到模型,如in the documentation所述。 例如:
new sap.m.Input({
value: {
path: "/Position/Bezeichnung",
type: new sap.ui.model.type.String(null, {
minLength: 1,
maxLength: 128
})
}
})
如上例所示,我在stringlength上使用约束。 当用户更改输入的值时,将触发验证,并根据Validationresult调用其中一个函数descripted here。 在这些函数中,我设置控件的ValueState,如下所示:
setupValidation: function() {
var oCore = sap.ui.getCore();
oCore.attachValidationError(function (oEvent) {
oEvent.getParameter("element").setValueState(sap.ui.core.ValueState.Error);
});
oCore.attachValidationSuccess(function (oEvent) {
oEvent.getParameter("element").setValueState(sap.ui.core.ValueState.None);
});
oCore.attachFormatError(function (oEvent) {
oEvent.getParameter("element").setValueState(sap.ui.core.ValueState.Error);
});
oCore.attachParseError(function (oEvent) {
oEvent.getParameter("element").setValueState(sap.ui.core.ValueState.Error);
});
},
假设绑定的模型变量是初始的。 我正在加载视图,属性值被解析并显示为空。 尽管未满足约束,但Validationerror / Parseerror方法仍然不。 这似乎是OpenUI5的标准行为。只有控件中的更改才会被验证。
现在让我们假设我有一个提交按钮,并且Inputcontrol的值仍为空。当用户点击提交按钮时,我想为我的视图的所有子控件触发DataBinding Validation。这将验证上述输入并导致错误。
我的问题是:如何触发视图中所有子控件的数据绑定验证?
在SO上还有另一个问题,海报要求提供一种定义必填字段的方法。建议的解决方案是在控件上调用getValue()并手动验证值。我认为这有点麻烦,因为形成和约束信息和逻辑已经存在。
答案 0 :(得分:2)
我建议调查现场小组。
字段组允许您将组ID分配给输入字段。然后,您可以立即调用所有输入字段。您可以在视图中分别在每个name
上设置required
属性和<Input>
属性,从而允许您在执行验证时处理某些逻辑。
您可以调用this.getView().getControlsByFieldGroupId("fieldGroupId")
,它将返回一组输入控件。然后,您可以遍历控件,将它们传递给逻辑,然后使用setValueState()
显示结果。
或者,您可以在父容器上分配validateFieldGroup
事件,父容器通常是表单,但可以是包含控件的<VBox>
。当用户焦点移出字段组时,将触发该事件。然后,您可以使用控制器中的事件处理程序来执行验证。
在您的情况下,我会为您的提交按钮分配一个press
事件,并在处理程序中,按ID调用字段组并循环控制。在函数结束时,在继续之前检查是否所有字段都已经过验证。
查看强>
<Input name="email" required="true" value="{/user/email}" fieldGroupIds="fgUser"/>
<Input name="firstName" required="false" value="{/user/firstName"} fieldGroupIds="fgUser"/>
<Button text="Submit" press="onSubmit"/>
控制器
onSubmit: function() {
var aControls = this.getView().getControlsByFieldGroupId("fgUser");
aControls.forEach(function(oControl) {
if (oControl.getRequired()) {
//do validation
oControl.setValueState("Error");
oControl.setValueStateText("Required Field");
}
if (oControl.getName() === "firstName") {
//do validation
oControl.setValueState("Success");
}
});
var bValidated = aControls.every(function(oControl) {
return oControl.getValueState() === "Success";
});
if (bValidated) {
//do submit
}
}
答案 1 :(得分:1)
概念是这样的。
绑定时使用自定义类型,以定义验证。验证 规则进入这些自定义类型(在方法'validateValue'中)。
按下提交时,循环控制层次结构和
验证视图中的每个控件。 (通过调用'validateValue'
自定义类型的方法。)
Validator(https://github.com/qualiture/ui5-validator)使用这个概念,它是一个小型库,让您的生活更轻松。它的主要优点是它以递归方式遍历控制库。
使用Message Manager(使用sap.ui.get.core()。getMessageManager())是在UI控件上显示验证消息的方法。
答案 2 :(得分:0)
无法触发数据绑定验证。相反,对于具有必需属性的空字段,您可以使用jQuery来解决问题。 请在Checking required fields
上查看我对这个问题的回答