1

我有以下的html代码:角2个负载数据之前呈现模板

<tbody ng-repeat="caterory in data"> 
     <tr> 
      <td [colSpan]="segment">{{ caterory.name }}</td> 
     </tr> 
     <tr ng-repeat="room in caterory.rooms"> 
      <td>{{room.room_no}}</td> 
      <td [colSpan]="schedule.dayDiff" ng-repeat="schedule in room.reservations">{{schedule.firstName}}</td> 
     </tr> 
    </tbody> 

当我跑,我发现了以下错误:

TypeError: Cannot read property 'name' of undefined

我GOOGLE了原因之后是数据当模板呈现时点着加载。这是我的组件代码:如何先加载数据然后再渲染模板?

ngOnInit() { this.reservationService.getUserBranch(this.authservice.getUserID()).subscribe(data => { 
     this.userBranch = data.json().branch; 
     this.brSelectedValue = this.userBranch[0].id 
     this.reservationService.getPerson('').subscribe(data => { 
     this.persons = data.json().person; 
     }); 
     // TO DO 
     this.fillDataRange(); 
    }); 
    } 

这fillDataRange是我的函数:

fillDataRange() { 
    this.reservationService.getReservation(this.brSelectedValue.toString(), this.intl.formatDate(this.dateFrom, 'yyyy-MM-dd'), this.intl.formatDate(this.dateTo, 'yyyy-MM-dd')).then(data => { 
     this.data = data; 
     console.log("Start", this.data); 


     for (var i = 0; i < this.data.length; i++) { // Loop Through Categories 
     if (this.data[i].rooms.length > 0) { 
      for (var j = 0; j < this.data[i].rooms.length; j++) { // Loop Through Rooms from Category 
      if (this.data[i].rooms[j].reservations.length > 0) { 
       var sheduleArray = []; 
       var a = 0; 
       var d = a; 
       var sumDayFiff = 0; 
       for (var t = 0; t < this.data[i].rooms[j].reservations.length; t++) { 
       var sheduleFrom = new Date(this.data[i].rooms[j].reservations[t].startDate); 
       var sheduleTo = new Date(this.data[i].rooms[j].reservations[t].endDate); 
       var status = this.data[i].rooms[j].reservations[t].status; 
       var oneDay = 24 * 60 * 60 * 1000; 
       var diffDays = Math.round(Math.abs((sheduleFrom.getTime() - sheduleTo.getTime())/(oneDay))); 
       for (a; a < this.segment; a++) { 
        var current = new Date(datesArray[d]); 
        if (current >= sheduleFrom && current <= sheduleTo) { 
        sheduleArray[a] = new Schedule(this.data[i].rooms[j].reservations[t].id, status, sheduleFrom, sheduleTo, this.data[i].rooms[j].reservations[t].id, this.data[i].rooms[j].reservations[t].id, this.data[i].rooms[j].reservations[t].id, this.data[i].rooms[j].reservations[t].id, diffDays, current, "reservationModal('" + current + "')", 'false', this.data[i].rooms[j].reservations[t].id, this.data[i].rooms[j].reservations[t].id); 
        a++; 
        d = d + diffDays; 
        sumDayFiff = sumDayFiff + diffDays; 
        break; 
        } else { 
        sheduleArray[a] = new Schedule("", 1, new Date(), new Date(), 1, "", "", "", 1, current, "reservationModal('" + current + "')", 'true', null, null); 
        } 
        d++; 
       } 
       sumDayFiff--; 
       } 
       for (a; a < this.segment - sumDayFiff; a++) { 
       sheduleArray[a] = new Schedule("", 1, new Date(), new Date(), 1, "", "", "", 1, datesArray[d + 1], "reservationModal('" + 1 + "')", 'true', null, null); 
       d++; 
       } 
       this.data[i].rooms[j].reservations = sheduleArray; 
      } else { 
       for (var f = 0; f < this.segment; f++) { 
       this.data[i].rooms[j].reservations[f] = new Schedule("", 1, new Date(), new Date(), 1, "", "", "", 1, datesArray[f], "reservationModal('" + 1 + "')", '', null, null); 
       } 
      } 
      } 
     } 
     } 
     console.log("End", JSON.stringify(this.data)); 
    }); 
    } 
+0

您可以尝试'{{caterory?.name}}':如果数据尚未加载,它将不会显示任何内容,并在其可用时加载它 –

+0

如果您确实需要先加载数据,则可以使用在路由器级别的resolve()函数告诉路由器等待这个函数解析数据,然后加载路由 –

+0

I alredy试试这个 {{caterory?。名称}} ​​{{室?.room_no}} {{日程?.firstName}} 但不呈现dable体 –

回答

3

可以使用?.代替.避免的情况下,错误.前值是null

<tbody *ngFor="let caterory of data"> <!-- some changes in this line --> 
    <tr> 
     <td [colSpan]="segment">{{ caterory?.name }}</td> <!-- added ? --> 
    </tr> 
    <tr *ngFor="let room of caterory.rooms"> <!-- changes ---> 
     <td>{{room.room_no}}</td> 
     <td [colSpan]="schedule?.dayDiff" *ngFor="let schedule of room.reservations">{{schedule?.firstName}}</td> <!-- changes --> 
    </tr> 
</tbody> 

如果你修好了(AngularJS)转换为Angular 2(4)语法,因此在此特定示例中不再需要?,因为当data尚不可用时,Angular将不会尝试渲染{{ caterory?.name }}

+1

我想唯一一次我可以比你更快Günter是当我不写一个完整的答案,并把它扔在评论:-)) –

+1

@AlexBeugnet对不起:D,但我有麻烦,自己放置答案。时下竞争太激烈: -/ –

+0

我们是否也可以在这种情况下使用懒加载??? @ Gunter –