2015-01-15 3 views
0

renderDays() 함수를 재정의하여 sap.ui.unified.Calendar를 사용자 정의 컨트롤로 확장하여 각 day div에 여분의 span 태그를 배치합니다.사용자 정의 컨트롤 렌더링을 두 번 수행

콘솔에 시간 배열이 정의되지 않았 음을 나타냅니다. 아래에서 오류가 발생하지만 이후에는 계속해서 오류가 발생합니다. 이 오류는 머리말 화살표를 사용하여 캘린더에서 월 간 이동을 방지합니다. 이 렌더링은 두 번입니까? 처음에는 시간 []이 정의되지 않았지만 이후에는 괜찮 았던 이유는 무엇입니까?

모든 코드를 단일 파일 JSBin에 넣으면 오류가 발생하지 않습니다. JSBin

사용자 지정 컨트롤에 대한 코드의 맨 :

sap.ui.unified.Calendar.extend("control.TimeCalendar", { 
    metadata : { 
     properties : { 
      "hoursData" : "string[]" 
     } 
    }, 

    renderer: { 
    renderDays: function(oRm, oCal, oDate){ 
     var hours = oCal.getHoursData(); 

콘솔 출력 : 사용자 정의 제어 TimeCalender.js에서

Cannot read property 'length' of undefined 

발췌. 이것은 do ... while 루프 안에 있으며 달력에 매일 배치됩니다. 함수가 날짜를 배치하는 곳에서 배열 'hours'에서 검색된 숫자의 span 태그도 포함합니다.

oRm.write("<span class=\"sapUiCalDayNum\">"); 

if ((hours.length>i) && (hours[i].day == oDay.getUTCDate())) { 
    oRm.write("<span class=\"hours\">"); 
    oRm.write(hours[i].hours); 
    oRm.write("</span>"); 
    if(i <= hours.length) { i++; } 
} 

oRm.write(oDay.getUTCDate()); 
oRm.write("</span>"); 

답변

0

추측을 가지고 가서, 나는 당신의 비 jsbin 시나리오에서 당신은 데이터 바인딩을 사용하고 데이터가 백엔드에서 asynchonously 수신하거나 또는이 처음 렌더링 한 후 설정되어 있는지 말할 것?

이 경우 hoursdata 값이 undefined로 설정되어 오류가 발생합니다.

이 같은 속성을 정의하는 경우 :

properties : { 
    "hoursData" : { type: "string[]", defaultValue: [] } 
} 

... 당신은 항상 길이 속성이 배열이 있는지 확인이 방법.

+0

도움 주셔서 감사합니다. 당신이 말했듯이 문제는 비동기식으로 로딩하는 것이 문제라고 생각합니다. 컨트롤러에서 모델을 변경하여 json 파일의 URL을 가리키는 대신 동일한 파일에 정의 된 변수에서 읽으면 작동했습니다. 그래서 컨트롤러를 loadData를 사용하도록 변경하고 비동기 플래그를 false로 설정하면 문제가 해결됩니다. 이후에는 false로 비동기가있는 OData 서비스로 변경되어 작동했습니다. – pyro

+1

동기 로딩은 거의 모든 경우에이를 수행하는 잘못된 방법입니다. UI 스레드를 차단하고 종종 사용자 환경이 좋지 않을 수 있습니다. 기본값을 사용하고 렌더러 내부의 일부 로직을 고려해야합니다. 예를 들어, 데이터가 설정되지 않은 경우 중단하여 필요할 때 비동기로드를 사용할 수 있습니다. – sirion

+0

동 기적으로로드하는 것은 좋지 않은 생각입니다. 그러나 당신의 defaultValue : [] 제안과 함께조차도 비동기로 OData 호출을 변경할 때 여전히 정의되지 않은 오류가 발생합니다. getHoursData()의 유형을 판별하기 위해 typeof를 사용했으며 예상치 못한 정의되지 않은 객체입니다. – pyro