自定义控件渲染两次

时间:2015-01-15 10:31:58

标签: javascript sapui5

我正在使用自定义控件扩展sap.ui.unified.Calendar,覆盖renderDays()函数,在每天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();

控制台输出:

Cannot read property 'length' of undefined

摘自自定义控件TimeCalender.js。这是在do ... while循环中,它将每一天放在日历上。在函数放置日期的地方,我还包括一个span标记,其中包含从数组'hours'中检索到的数字。

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>");

1 个答案:

答案 0 :(得分:0)

猜测一下,我会说你在非jsbin场景中使用数据绑定,数据是从后端异步接收还是在第一次渲染后设置?

在这种情况下,hoursdata值设置为undefined,这会导致错误。

如果你定义这样的属性:

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

...这样你就可以确保总有一个数组,它有一个长度属性。