angular - 时间线模板会是什么样子?

标签 angular angular2-template

我正在尝试构建一个TimelineComponent,我的想法是我可以编写

<timeline>
   <timeline-item-group *ngFor="#group of groups" date="group.date">
      <timeline-item *ngFor="#item in group.items">
         ...do something with item here...
      </timeline-item>
   <timeline-item-group>
</timeline>

这将转换为

<ul class="timeline">
  <li class="timeline-item">...group 1 item 1...</li>
  <li class="timeline-item">...group 1 item 2...</li>
  ...
  <li class="timeline-separator">...group 1 date...</li>
  <li class="timeline-item">...group 2 item 1...</li>
  <li class="timeline-item">...group 2 item 2...</li>
  ...
  <li class="timeline-separator">...group 2 date...</li>           
</ul

这是组件的 typescript :

import { Component, Input } from 'angular2/core'

@Component({
   selector: 'timeline',
   templateUrl: 'app/timeline.component.html',
   styleUrls: ['app/timeline.component.css']
})
export class TimelineComponent {
   groups: TimelineItemGroupComponent[] = [];
   constructor() {
   }
   addGroup(group: TimelineItemGroupComponent) {
      this.groups.push(group);
      console.log('item added');
   }
}

@Component({
   selector: 'timeline-item-group',
   templateUrl: 'app/timeline-item-group.component.html',
   styleUrls: ['app/timeline-item-group.component.css']
})
export class TimelineItemGroupComponent {
   @Input() name: string;
   items: TimelineItemComponent[] = [];
   constructor(timeline: TimelineComponent) {
      timeline.addGroup(this);
   }
   addItem(item: TimelineItemComponent) {
      this.items.push(item);
   }
}

@Component({
   selector: 'timeline-item',
   templateUrl: 'app/timeline-item.component.html',
   styleUrls: ['app/timeline-item.component.css']
})
export class TimelineItemComponent {
   @Input() title: string;
   constructor(timelineGroup: TimelineItemGroupComponent) {
      timelineGroup.addItem(this);
   }
}

问题是,我如何循环这些组?如果这只是一个简单的项目列表,我会简单地写

<ul>
   <li class="timeline-item" *ngFor="#item of items">...</li>
</ul>

但是还有一个级别需要循环(组),并且我不想生成额外的标签,例如

<ul>
   <div *ngFor="#group of groups">
      <li class="timeline-item" *ngFor="#item of group.items">...</li>
      <li class="timeline-separator">{{group.date}}</li>
   </div>
</ul>

希望我的观点得到了理解。那么我的选择是什么?

最佳答案

无法展平嵌套的*ngFor

在从数据生成 DOM 并使用之前将数据展平即可

<ul>
   <ng-container *ngFor="let item of flattenedHeroes trackBy:trackByHeroes">
     <li class="timeline-item">...</li>
     <li class="timeline-separator" *ngIf="item.isGroup">{{item.date}}</li>
   </ng-container>
</ul>

我刚刚发明了isGroup。这可以是任何可以区分组和项目的内容。

关于angular - 时间线模板会是什么样子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36396509/

相关文章:

javascript - Angular 2无法在html页面中显示项目列表

angular - 如何在 Angular 4 上使用 Typescript 2 和 Jasmine 2 模拟或监视没有对象的外部函数

Angular 2 模型函数插值 - self.context.$implicit.X 不是函数

html - Angular2,禁用 anchor 元素的正确方法是什么?

angular - 最佳实践和理解 Angular2 中的任何关键字?

angular - 如何在 Angular 2+ 中包含模板部分

angular - 如何对以 TemplateRef 作为输入的 Angular 组件进行单元测试?

javascript - 使用 RxJS 过滤单个值并返回一个可观察对象,并在 Angular 的模板中通过异步使用可观察对象

选择框的 Angular 2 ngModel 更改未更新所选选项

Angular2 编译器-cli 无法识别 [ngClass] 或 *ngIf