如何触发所有控件的DataBinding验证?

时间:2014-12-10 08:18:16

标签: validation sapui5

我有一个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()并手动验证值。我认为这有点麻烦,因为形成和约束信息和逻辑已经存在。

3 个答案:

答案 0 :(得分:2)

我建议调查现场小组。

示例here in the UI5 docs

字段组允许您将组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

上查看我对这个问题的回答