2017-01-31 1 views
1

datetimepicker에 대한 validationError 콜백을 XML보기에 등록하는 방법과 유효하지 않은 날짜 입력으로이 이벤트를 발생시키는 방법.datetime picker의 입력 유효성 확인

datetimepicker control은 팝업 날짜 선택 도구가있는 입력 상자입니다.

사용자는 입력에 직접 입력하거나 선택한 날짜를 사용하여 날짜를 선택할 수 있습니다. 정교한 유효성 검사를 datetime 값에 추가 할 수 있지만 "1010101010010101010101010"또는 "32/15/2019"와 같이 사용자가 유효하지 않은 날짜를 상자에 입력 할 때 validationError 이벤트를 트리거하려고합니다.

이상적으로 나는 유효한 날짜 값을 테스트하고 필요에 따라 validationError() 함수를 트리거하는 제약 조건을 찾고 있습니다.

나는 change() 이벤트를 사용하고 JS의 유효성 검사를 수행하고 valueState 등을 설정하는 것이 좋습니다.하지만 datetimepicker가 초과 JS를 사용하지 않고이 작업을 수행 할 수 있는지 알고 싶습니다.

나는이 문서가 어딘가에 있어야한다고 확신하지만 아직 결정적인 것을 찾지 못했다. 나는 엄격한 파싱이 어떤 역할을해야한다고 생각한다.

새로운 데이터 유형 선언을 통해 날짜 범위 제약 조건 설정에 대해 this SO question이 발견되었습니다. 나는 이것이 해결책 일 줄 알았지 만, '유효한 날짜'입력 값에 대한 제약 조건을 설정하는 방법에 열중하고 있습니다. 이

날짜 시간 유형은 다음과 같은 검증 제약 지원 언급 sap.ui.model.type.DateTime에 대해

SAPUI5의 문서를 읽기 :

최대 최소 (AN dateTime에 기대 (소스 패턴 형식으로 제시된 dateTime으로 기대) 소스 패턴 형식으로 표시)

정확한 날짜 유효성 검사 또는 형식 검사 방법에 대한 지침이 없습니다.

누구나 올바른 방향으로 나를 가리킬 수 있습니까?

EDIT - @Matbtt 및 docs에 대한 제안에 따라 유형을 문자열 리터럴 sap.ui.model.type.DateTime으로 변경했습니다. 그러나 스 니펫은 결과물을 출력하지 못했습니다. 저는 이것을 문자열에 묶는 모델의 바인딩으로 추적했습니다. JS 날짜 개체에 바인딩되도록 변경되면이 문제가 해결되었습니다.

EDIT - @ 개발자가 validationError 콜백을 추가했지만 작동하지 않는 것으로 제안합니다. 스 니펫을 참조하십시오.

// 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' 이벤트에 연결해야합니다. UI 메시지 생성을 포함하는 [내 답변] (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 작업. sap.m.DateTimePicker의

EDITED 15시 3분 310,117

변경 이벤트 클래스 sap.m.DatePicker에서 event을 빌려있다.

+0

감사합니다. Jaro - 귀하의 솔루션에 주목했습니다. 유효한 매개 변수를 설명하는 문서에 대한 링크를 제공 할 수 있습니까? –

+1

여기에 https://openui5.hana.ondemand.com/#docs/api/symbols/sap.m.DatePicker.html#event:change – Jaro

+0

감사하지만 내가 보려고하는 API에서 해당 페이지의 일부가 아닙니다. 분명한. 더 자세하게 얘기해 주 시겠어요? 또한 DateTimeInput-dbg.js 소스 파일을 살펴보면 change 이벤트에 대한 매개 변수에서'valid'에 대한 언급을 볼 수 있습니다. 설명에'설정되면 입력 한 값이 유효한 날짜입니다. 설정하지 않으면 입력 한 값을 날짜로 변환 할 수 없습니다. '따라서 해결 방법이 실용적으로 보입니다. –

1

HTML 형식의 빌드가 아닌 JavaScript 객체를 참조 할 때 데이터 유형 선언에 정규화 된 객체 이름을 사용해야합니다. 다음과 같은 부분을 변경하는 경우 :

DateTime

sap.ui.model.type.DateTime로 작동합니다. 유형이 사용 중이면 예에서 사용 된 valueFormat 또는 displayFormat과 같은 속성은 무시됩니다. 이 경우 바인딩에서 이러한 정보를 제공해야합니다. 자세한 내용은 구현 유형 documentation을 확인하십시오.

축약 된 예는 here입니다. examples은 일반적으로 좋은 출발점 인 UI5 Explored 응용 프로그램에서 찾을 수 있습니다. 일반적으로 바인딩에 대한 설명은 here에서 찾을 수 있습니다.

+0

Thanks Mat. 필자는 datetime 입력 옵션과 그 조합의 배열에 대해 당황스러워합니다. 나는 '입력 학교'에 갈 필요가 있다고 생각한다.링크에 따라 API 설명서를 읽는 것 외에는 약간의 정보가 있습니다. 입력 및 검증에 대한 단일 소스 문서 또는 자습서가 있습니까? UI5는 매우 유능한 것처럼 보이지만 지식 격차를 무너 뜨릴 위험에 처해 있습니다. [어떤 SAPUI5 블로거 입력을 알고 있다면 그 옵션과 효과는 훌륭한 주제가 될 것입니다. 바인딩 된 날짜에는 변경된 데이터를받는 방법에 대한 추가 문제가 있습니다.] –

+1

유형이 많은 다양한 백엔드 시스템을 처리해야하므로 복잡한 주제입니다. 레거시 시스템. 공식 자원에 대한 링크를 더 추가했습니다. 이 특정 문제에 관해 쓴 블로거를 알지 못합니다. 마지막 문장을 분명히 해 주시겠습니까? 변경된 데이터의 의미는 무엇입니까? – matbtt

+0

감사합니다. 링크 된 바인딩 문서를 다시 읽고 있습니다. 필자가 마지막으로 지적한 것은 데이터가 모델로 다시 공급되는 방식에 대한 우려였다. –

0

JS에서 그렇게 많은 일을하고 싶지 않다면 validationError 이벤트로 작업 할 수 있다고 생각합니다. 단순히 XML에 validationError="functionNameHere"을 설정하고 JS에 ValueState를 오류로 설정할 수 있습니다. 값을 모델로 보낼 수 없으면 validationError 이벤트가 발생하므로 서식을 검사 할 필요가 없으므로이 이벤트는 실제로 서식이 잘못되었음을 의미합니다. 아래 링크를 확인하여 설명서를 읽을 수 있습니다. 잘못된 날짜를 입력

+0

감사합니다. 스 니펫에 validationError 콜백을 포함하도록 편집했으나 호출되지 않습니다. –

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

    (예를 들어, "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에서 오류 메시지를 표시 : 여기

는 시도에의 예입니다 사용자에게 무엇을 할 지 안내합니다. UI Messages을 참조하십시오.