【发布时间】: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