2017-01-31 7 views
1

Как зарегистрировать validationError callback для datetimepicker в представлении XML и как получить это событие для недействительного ввода даты.Подтвердить ввод команды выбора даты и времени

datetimepicker control это поле ввода с всплывающим выбором даты.

Пользователь может ввести непосредственно во вход или использовать выбранную дату, чтобы выбрать дату. Я могу добавить сложную проверку значения datetime, но я пытаюсь просто вызвать событие validationError, когда пользователь вводит неверную дату в поле, например «101010101001010101010101010» или «32/15/2019».

В идеале я ищу ограничение, которое проверяет допустимое значение даты и запускает функцию validationError(), если это необходимо.

Я думаю, что обходным путем является использование события change() и проверка в JS, установка значенияState и т. Д., Но я хочу понять, что может сделать datetimepicker в этом отношении, не прибегая к избыточному JS.

Я убежден, что это должно быть где-то в документах, но еще не найдено ничего убедительного. Я чувствую, что строгая игра должна сыграть определенную роль.

Я нашел this SO question о ограничении диапазона дат даты, объявив новый тип данных. Я думал, что это может быть решением, но я застрял в том, как установить ограничение для входного значения «действительная дата».

Чтение SAPUI5 документов о sap.ui.model.type.DateTime он упоминает

Тип DateTime поддерживает следующие ограничения валидации:

максимума (ожидает DateTime представлены в формате исходного шаблона) минимума (ожидает DateTime представленный в формате исходного шаблона)

, который не дает никаких указаний относительно того, как проводить прямую проверку даты или формат.

Может ли кто-нибудь указать мне правильное направление?

EDIT - по предложению @Matbtt и ссылки на документы я изменил тип на строковый литерал sap.ui.model.type.DateTime. Однако после этого фрагмент не выдал никакого результата. Я проследил это с привязкой к модели, где я привязывался к строке. При изменении привязки к объекту даты JS это было исправлено.

EDIT - по предложению @Developer добавил validationError callback, но не работает. См. Фрагмент.

// 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="{ 
 
      \t path: '/startdateraw', 
 
       type: 'sap.ui.model.type.DateTime', 
 
       strictParsing: 'true' 
 
       }" 
 
       /> 
 

 

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

 
    </mvc:View> 
 
</script> 
 

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

+0

Для недействительных входов вам необходимо привязать обработчик к событию 'parseError'. Я добавил свой [ответ ниже] (https://stackoverflow.com/a/48482544/5846045), который включает в себя создание сообщений пользовательского интерфейса. – boghyon

ответ

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.

EDITED 15:03 310117

Изменить событие sap.m.DateTimePicker заимствован event из класса sap.m.DatePicker.

+0

Спасибо Яро - я отметил ваше решение. Можете ли вы предоставить ссылку на документы, описывающие действительный параметр? –

+1

Здесь https://openui5.hana.ondemand.com/#docs/api/symbols/sap.m.DatePicker.html#event:change – Jaro

+0

спасибо, но часть этой страницы в API, которую вы намерены мне видеть, не является очевидно. Можете быть более конкретными? Кроме того, я посмотрел исходный файл DateTimeInput-dbg.js и могу видеть упоминание «valid» в параметрах для события изменения. Описание говорит 'если установлено, введенное значение является допустимой датой. Если не установлено, введенное значение не может быть преобразовано в дату. Поэтому кажется, что ваше обходное решение является жизнеспособным. –

1

Вы должны использовать полное имя объекта в объявлении типа данных, поскольку вы имеете в виду объект JavaScript, а не для сборки в формате HTML. Если вы измените следующую часть:

DateTime к sap.ui.model.type.DateTime

он будет работать. Имейте в виду, что такие атрибуты, как valueFormat или displayFormat, используемые в вашем примере, игнорируются, если тип используется. В этом случае вы должны предоставить эту информацию в привязке. Для получения дополнительной информации, пожалуйста, проверьте documentation реализации типа.

Укороченный пример можно найти here. Более examples можно найти в UI5 Explored приложении, которое, как правило, является хорошей отправной точкой. Объяснение привязки в целом можно найти here.

+0

Thanks Mat. Я не могу не чувствовать себя озадаченным множеством параметров ввода даты и времени и их комбинацией. Я думаю, мне нужно пойти в «школу ввода».Помимо документации API по вашей ссылке, которую я считаю немного загадочной, есть ли один исходный документ или учебник по вводу и проверке? UI5 кажется очень способным, но мне грозит опасность разрыва в знаниях. [Если вы знаете, что входы в блоггеры SAPUI5 и их варианты и эффекты будут отличной темой для написания. Связанные даты также содержат дополнительную информацию о том, как получать измененные данные.] –

+1

Это действительно сложная тема, так как типы должны обрабатывать множество разных бэкэнд-систем, например. унаследованной системы. Я добавил дополнительные ссылки на официальные ресурсы. Я не знаю блоггера, который писал об этой конкретной проблеме. Не могли бы вы прояснить последнее предложение? Что означает получение измененных данных? – matbtt

+0

Спасибо - я перечитываю связанные документы, которые вы связали. Мой последний момент касался вопроса о том, как данные будут возвращаться обратно в модель. –

0

Если вы не хотите работать в JS, я считаю, что вы можете работать с событием validationError. Просто введите в свой XML, validationError="functionNameHere" и в JS вы можете просто установить ValueState на ошибку. Событие validationError запускается, когда значение не может быть отправлено модели, поэтому вам не нужно делать какие-либо проверки форматирования, это событие означает, что форматирование действительно неверно. Вы можете проверить приведенную ниже ссылку, чтобы прочитать документацию.

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

+0

Спасибо - отредактировал фрагмент, чтобы включить обратный вызов validationError, но это, похоже, не вызывается. –

1
  • Когда неверная дата вводится (например, "123123"), событие parseError обжигают.
  • Когда введенная дата действительна, но нарушает одно из определенных ограничений, только тогда выполняется событие validationError.

Вот пример из них попробовать:

sap.ui.getCore().attachInit(() => sap.ui.xmlview({ 
 
    async: true, 
 
    viewContent: `<mvc:View xmlns:mvc="sap.ui.core.mvc" xmlns="sap.m" 
 
    controllerName="MyController" 
 
    > 
 
    <DateTimePicker id="myDateTimePicker" 
 
     parseError=".onParseError" 
 
     validationError=".onValidationError" 
 
     width="15rem" 
 
    /> 
 
    </mvc:View>`, 
 

 
    controller: sap.ui.controller("MyController", { 
 
    onInit: function() { 
 
     sap.ui.getCore().getMessageManager().registerObject(this.getView(), true); // or enable "handleValidation" in Component/app descriptor 
 
     this.byId("myDateTimePicker").bindValue({ 
 
     path: '/myDate', 
 
     type: 'sap.ui.model.type.DateTime', // or 'sap.ui.model.odata.type.DateTime' in case of OData 
 
     constraints: { 
 
      minimum: new Date(), // Now 
 
     }, 
 
     }); 
 
    }, 
 
    onParseError: function(event) { 
 
     alert("Parse Error"); 
 
    }, 
 
    onValidationError: function(event) { 
 
     alert("Validation Error"); 
 
    }, 
 
    }), 
 

 
}).loaded().then(view => sap.ui.require([ 
 
    "sap/ui/model/json/JSONModel", 
 
], JSONModel => view.setModel(new JSONModel({ 
 
    myDate: new Date(), 
 
})).placeAt("content"))));
<script src="https://openui5.hana.ondemand.com/resources/sap-ui-core.js" id="sap-ui-bootstrap" 
 
    data-sap-ui-theme="sap_belize" 
 
    data-sap-ui-libs="sap.ui.core, sap.m, sap.ui.unified" 
 
    data-sap-ui-preload="async" 
 
    data-sap-ui-compatVerison="edge" 
 
    data-sap-ui-xx-waitForTheme="true" 
 
></script><body id="content" class="sapUiBody sapUiSizeCompact"></body>

При желании можно также зарегистрировать элемент управления (или весь компонент) для отображения сообщений об ошибках в пользовательском интерфейсе чтобы помочь пользователю, что делать. См. UI Messages.