【问题标题】:Validate input of datetime picker验证日期时间选择器的输入
【发布时间】:2017-01-31 12:44:57
【问题描述】:

如何在 XML 视图中为 datetimepicker 注册validationError 回调以及如何为无效的日期输入触发此事件。

datetimepicker control 是一个带有弹出日期选择器的输入框。

用户可以直接在输入中键入或使用选择的日期来选择日期。我可以向 datetime 值添加复杂的验证,但我试图在用户在框中键入无效日期时简单地触发 validationError 事件,例如“1010101010010101010101010”或“32/15/2019”。

理想情况下,我正在寻找一个测试有效日期值并在需要时触发validationError() 函数的约束。

我想一种解决方法是使用 change() 事件并在 JS 中进行验证,设置 valueState 等,但我想了解 datetimepicker 在这方面可以做什么,而不必求助于过多的 JS。

我确信这一定是在某个地方的文档中,但还没有找到任何结论性的东西。我觉得 strictParsing 应该发挥一些作用。

我发现this SO questionabout 通过声明新数据类型来设置日期范围约束。我认为这可能是一个解决方案,但我不知道如何为“有效日期”输入值设置约束。

阅读其中提到的关于sap.ui.model.type.DateTime 的 SAPUI5 文档

DateTime 类型支持以下验证约束:

最大值(期望以源模式格式显示的日期时间) 最小值(期望以源模式格式显示的 dateTime)

它没有提供有关如何进行直接日期有效性或格式检查的指示。

谁能指出我正确的方向?

编辑-根据@Matbtt 的建议和对文档的引用,我将类型更改为字符串文字sap.ui.model.type.DateTime。然而,sn-p 然后没有产生任何输出。我将此追溯到绑定到我绑定到字符串的模型的绑定。当更改为绑定到 JS 日期对象时,此问题已修复。

编辑 - 根据@Developer 的建议添加了validationError 回调,但似乎不起作用。见 sn-p。

// JSON sample data
var classData = {className: "Coding 101", id: 800, startdate: "2017-12-31T23:59:59.000"}

// convert JSON date to JS date object and format via moment for UI5 consumption
classData.startdateraw = new Date(classData.startdate)
classData.startdatefmt = moment(classData.startdateraw).format('YYYY-MM-DD-HH-mm-ss') 

sap.ui.getCore().attachInit(function() {
   "use strict";
   sap.ui.controller("MyController", {
     onInit: function() {

    // create JSON model instance
    var oModel = new sap.ui.model.json.JSONModel();

    // set the data for the model
    oModel.setData(classData);
   
    // set model to core.
    sap.ui.getCore().setModel(oModel);

    // Enable validation !!
    sap.ui.getCore().getMessageManager().registerObject(this.getView(), true);
     
    
     this.getView().byId("startDate").attachValidationError(function(){
        
        alert('Validation error fires - hoorah')
        
      }) 
       
     },
     valError : function(){
       console.log("There was a validation error")
      }
   });
   sap.ui.xmlview({
     viewContent: jQuery("#myView").html()
   }).placeAt("content");
  
  });
<script src="http://cdnjs.cloudflare.com/ajax/libs/moment.js/1.7.2/moment.min.js"></script>
<script src="https://sapui5.hana.ondemand.com/resources/sap-ui-core.js" id="sap-ui-bootstrap" data-sap-ui-theme="sap_bluecrystal" data-sap-ui-libs="sap.m" data-sap-ui-bindingSyntax="complex" data-sap-ui-compatVersion="edge" data-sap-ui-preload="async"></script>

<script id="myView" type="ui5/xmlview">
  <mvc:View controllerName="MyController" xmlns="sap.m" xmlns:core="sap.ui.core" xmlns:mvc="sap.ui.core.mvc" xmlns:layout="sap.ui.commons.layout" xmlns:f="sap.ui.layout.form">


    <f:SimpleForm id="EditForm" maxContainerCols="2" editable="true" width="25rem" layout="ResponsiveGridLayout" path="{}">
      <f:content>


        <Label id="lblStartDate" text="Start" design="Bold" labelFor="startDate" />
        <DateTimePicker 
            id="startDate" 
            placeholder="Enter a crazy date and time, e.g. 23/01/12345" 
            valueFormat="yyyy-MM-dd-HH-mm-ss" 
            validationError="valError"
            value="{
            	path: '/startdateraw',
                type: 'sap.ui.model.type.DateTime',  
                strictParsing: 'true'
              }" 
              />


      </f:content>
    </f:SimpleForm>

  </mvc:View>
</script>

<div id="content"></div>

【问题讨论】:

  • 对于无效输入,您需要将处理程序附加到 parseError 事件。我添加了我的answer below,其中包括生成 UI 消息。

标签: sapui5


【解决方案1】:

您可以通过处理sap.m.DateTimePicker的更改事件来做到这一点:

handleChange : function(oEvent){
   var bValid   = oEvent.getParameter("valid");

   if(!bValid){             
      sap.m.MessageToast.show("Entered date range isn't valid");
      return;
   }
}

Jsbin 工作 example.

已编辑 15:03 310117

sap.m.DateTimePicker 的更改事件是从类 sap.m.DatePicker 借用 event

【讨论】:

  • 谢谢 Jaro - 我已经注意到您的解决方案。您能否提供描述有效参数的文档的链接?
  • 谢谢,但是您希望我看到的 API 中该页面的部分并不明显。你可以说得更详细点吗?另外,我查看了 DateTimeInput-dbg.js 源文件,可以看到在更改事件的参数中提到了valid。描述说if set, the entered value is a valid date. If not set the entered value cannot be converted to a date. 因此,您的解决方法似乎是可行的。
  • 请忘记 DateTimeInput 并查看我在评论中发送的链接(与我编辑部分中的链接相同)。它从 api 告诉:{boolean} oControlEvent.getParameters.valid => 有效日期的指标。你说得对,没有明确写出真为有效,假为无效,但当你测试它时,真为有效,假为相反。
【解决方案2】:
  • 当输入格式无效的值(例如“123123”)时,会触发事件parseError
  • 当输入的内容可以被解析但违反了定义的约束之一时,只有这样,才会触发事件validationError

这里有一个示例供您试用:

sap.ui.getCore().attachInit(() => sap.ui.require([
  "sap/ui/core/mvc/XMLView",
  "sap/ui/model/json/JSONModel",
], (XMLView, JSONModel) => XMLView.create({
  definition: `<mvc:View
    xmlns:mvc="sap.ui.core.mvc"
    xmlns="sap.m"
  >
    <DateTimePicker id="myDTP" width="15rem"
      value="{
        path:'/myDate',
        type: 'sap.ui.model.type.DateTime',
        formatOptions: {
          style: 'medium/short'
        }
      }"
      parseError="alert('Parse error')"
      validationError="alert('Validation error')"
    />
    <ObjectAttribute title="Minimum" text="now" />
  </mvc:View>`,
  afterInit: function() {
    const dateTimeValueBinding = this.byId("myDTP").getBinding("value");
    dateTimeValueBinding.getType().setConstraints({
      minimum: new Date(),
    });
  },
  models: new JSONModel({
    myDate: new Date(),
  }),
}).then(view => {
  const msgMgr = sap.ui.getCore().getMessageManager();
  msgMgr.registerObject(view.placeAt("content"), true);
})));
<script id="sap-ui-bootstrap"
  src="https://ui5.sap.com/resources/sap-ui-core.js"
  data-sap-ui-libs="sap.ui.core, sap.m, sap.ui.unified"
  data-sap-ui-theme="sap_belize"
  data-sap-ui-async="true"
  data-sap-ui-compatVersion="edge"
  data-sap-ui-xx-waitForTheme="true"
></script>
<body id="content" class="sapUiBody sapUiSizeCompact"></body>

或者,您还可以注册控件(或整个组件)以在 UI 中显示错误消息,以指导用户做什么。见UI Messages

【讨论】:

    【解决方案3】:

    您必须在数据类型声明中使用完全限定的对象名称,因为您指的是 JavaScript 对象而不是 HTML 类型的构建。如果您更改以下部分:

    DateTimesap.ui.model.type.DateTime

    它会起作用的。请注意,如果正在使用类型,则会忽略示例中使用的 valueFormatdisplayFormat 等属性。在这种情况下,您必须在绑定中提供这些信息。更多详情请查看类型实现的documentation

    可以在here 找到一个简短的示例。更多 examples 可以在 UI5 探索应用程序中找到,这通常是一个很好的起点。一般绑定的解释可以在here找到。

    【讨论】:

    • 谢谢垫。我不禁对日期时间输入选项及其组合感到困惑。我想我需要去“输入学校”。除了根据您的链接的 API 文档(我觉得有点神秘)之外,是否有关于输入和验证的单一源文档或教程? UI5 看起来很有能力,但我有陷入知识鸿沟的危险。 [如果您知道任何 SAPUI5 博主的输入及其选项和效果,那将是一个很好的主题。绑定日期还有一个额外的问题,即如何接收更改的数据。]
    • 这确实是一个复杂的话题,因为类型需要处理很多不同的后端系统,例如遗留系统。我添加了更多官方资源的链接。我不知道有哪位博主写过关于这个特定问题的文章。你能澄清最后一句话吗?接收更改的数据是什么意思?
    • 谢谢 - 我正在重新阅读您链接的绑定文档。我的最后一点是关于如何将数据反馈到模型中的问题。
    • 如果该值已被类型实现验证,则该值会自动设置为模型。
    【解决方案4】:

    如果你不想在 JS 中做那么多工作,我相信你可以使用 validationError 事件。只需在您的 XML、validationError="functionNameHere" 和您的 JS 中设置,您就可以将 ValueState 设置为错误。 validationError 事件在值无法发送到模型时触发,因此您不必对格式进行任何检查,该事件发生意味着格式确实错误。您可以查看下面的链接以阅读文档。

    https://sapui5.hana.ondemand.com/#docs/api/symbols/sap.ui.base.ManagedObject.html#event:validationError

    【讨论】:

    • 谢谢 - 编辑了 sn-p 以包含一个 validationError 回调,但这似乎没有被调用。
    • validationError 事件是不够的,因为它只有在值超出定义的constraints 范围时才会触发。要首先检查输入的值是否采用正确的格式,另外需要parseError needs to be handled
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2013-02-02
    • 1970-01-01
    相关资源
    最近更新 更多