我有一个OpenUI5表单,包含许多Inputcontrols.这些Inputcontrols使用OpenUI5 DataBinding绑定到模型,如文档中所述.例如:
new sap.m.Input({                           
    value: {
        path: "/Position/Bezeichnung",
        type: new sap.ui.model.type.String(null, {
            minLength: 1,
            maxLength: 128
        })
    }
}) 
如上例所示,我在stringlength上使用约束.当用户更改输入的值时,将触发验证,并根据Validationresult 调用此处描述的功能之一.在这些函数中,我正在设置控件的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()并手动验证值.我认为这有点麻烦,因为形成和约束信息和逻辑已经存在.
我建议调查现场组。
一个例子在UI5文档在这里
字段组允许您为输入字段分配组 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
     }
}