0

material_projects 또는 project_services가 포함 된 프로젝트 api가 있습니다. 나는 그 중 하나를 어떻게 표시 할 것인지 혼란 스럽다. material_projects를 표시하면 project_services를 표시하면 안됩니다. project_services는 api에서 비어 있어야합니다. 그 제약 조건을 보장 할 수있는 경우특정 데이터를 2/4 각도로 표시

getAllProjects() { 
    this.subscription = this.projectsService.getAll() 
     .subscribe(
     (data:any) => { 
      this.projects = data.projects; 
      console.log(data); 
     }, 
     error => { 
      console.log(error); 
     }); 
    } 

HTML

<div class="card-block" *ngFor="let project of projects | search : searchBOM"> 
    <h2 class="proj-name">{{ project.name | titlecase }} </h2> 
    <table class="table table-bordered table-striped"> 
    <thead> 
     <tr> 
     <th>Material SKU</th> 
     <th>Material Name</th> 
     <th>Unit</th> 
     </tr> 
    </thead> 
    <tbody> 
     <tr *ngFor="let innerItem of project.material_projects"> 
     <td>{{innerItem.material.sku}}</td> 
     <td>{{innerItem.material.name}}</td> 
     <td>{{innerItem.unit}}</td> 
     </tr> 
    </tbody> 
    </table> 
</div> 

enter image description here

답변

1

것은, 당신은 단순히 두 목록을 반복 할 수 있습니다.

<tbody> 
    <!-- You may want to perform the concatenation inside of the view model for additional clarity --> 
    <tr *ngFor="let innerItem of project.material_projects.concat(project.project_services)"> 
    <td>{{(innerItem.material || innerItem.service).sku}}</td> 
    <td>{{(innerItem.material || innerItem.service).name}}</td> 
    <td>{{innerItem.unit}}</td> 
    </tr> 
</tbody> 
: DTO들이 충분히 유사하다면, 당신은 뷰 로직의 이상을 공유하는 고려할 수,

<tbody> 
    <ng-container *ngIf="project.material_projects.length > 0; then #materialProjectsRows; else #projectServicesRows"></ng-container> 
    <ng-template #materialProjectsRows> 
    <tr *ngFor="let innerItem of project.material_projects"> 
     <td>{{innerItem.material.sku}}</td> 
     <td>{{innerItem.material.name}}</td> 
     <td>{{innerItem.unit}}</td> 
    </tr> 
    </ng-template> 
    <ng-template #projectServicesRows> 
    <tr *ngFor="let innerItem of project.projectServices"> 
     <td>{{innerItem.service.sku}}</td> 
     <td>{{innerItem.service.name}}</td> 
     <td>{{innerItem.unit}}</td> 
    </tr> 
    </ng-template> 
</tbody> 

을 또는 :

대안으로
<tbody> 
    <tr *ngFor="let innerItem of project.material_projects"> 
    <td>{{innerItem.material.sku}}</td> 
    <td>{{innerItem.material.name}}</td> 
    <td>{{innerItem.unit}}</td> 
    </tr> 
    <tr *ngFor="let innerItem of project.project_services"> 
    <td>{{innerItem.service.sku}}</td> 
    <td>{{innerItem.service.name}}</td> 
    <td>{{innerItem.unit}}</td> 
    </tr> 
</tbody> 

, 당신은 조건부 둘 중 하나를 표시 할 수 있습니다


편집 :

등록 정보의 존재 여부에 따라 다른 테이블을 사용하려는 경우 *ngIf 문을 <table> 요소 나 직접적인 하위 항목으로 옮길 수 있습니다. 귀하의 의견을 바탕으로, 다음과 같은 것을 시도 할 수 있습니다 :

<div class="card-block" *ngFor="let project of projects | search : searchBOM"> 
    <ng-container *ngIf="getProjectType(project)"> 
    <h2 class="proj-name">{{ project.name | titlecase }}</h2> 

    <table *ngIf="getProjectType(project) === 'material'" class="table table-bordered table-striped"> 
     <thead> 
     <tr> 
      <th>Material SKU</th> 
      <th>Material Name</th> 
      <th>Unit</th> 
     </tr> 
     </thead> 
     <tbody> 
     <tr *ngFor="let innerItem of project.material_projects"> 
      <td>{{innerItem.material.sku}}</td> 
      <td>{{innerItem.material.name}}</td> 
      <td>{{innerItem.unit}}</td> 
     </tr> 
     </tbody> 
    </table> 

    <table *ngIf="getProjectType(project) === 'services'" class="table table-bordered table-striped"> 
     <thead> 
     <tr> 
      <th>Project SKU</th> 
      <th>Project Name</th> 
      <th>Unit</th> 
     </tr> 
     </thead> 
     <tbody> 
     <tr *ngFor="let innerItem of project.project_services"> 
      <td>{{innerItem.project.sku}}</td> 
      <td>{{innerItem.project.name}}</td> 
      <td>{{innerItem.unit}}</td> 
     </tr> 
     </tbody> 
    </table> 

    </ng-container> 
</div> 

구성 요소 코드 :

export class ProjectComponent { 
    ... 
    public getProjectType(project: Project): 'material' | 'services' | null { 
     return project.material_projects.length > 0 ? 'material' 
      : project.project_services.length > 0 ? 'services' 
      : null; 
    } 
    ... 
} 

이 작업을 수행하는 방법에는 여러 가지가 있습니다을. 또 다른 옵션은 템플릿에서 switch 문을 사용하거나 추가 자식 ("더미") 구성 요소를 추가하여 동작을 처리하는 것입니다.

+0

실제로 material_projects와 projects_services는 theads가 다릅니다. material_projects 및 project_services가 아닌 경우 아무 것도 표시하지 마십시오 –

+0

material_projects 또는 project_services가없는 경우 어떻게 3 가지 조건을 만들 수 있습니까? 그런 다음 특정 프로젝트를 표시하지 않습니까? –

+0

@ GraySingh, 세 번째 조건을 추가해야하는 경우 상위 노드에 또 다른'* ngIf' 구조 지시문을 추가 할 수 있습니다. 편집을 참조하십시오. Angular에서 동일한 문제를 해결하는 방법은 여러 가지가 있으므로이 구성 요소를 작성하는 데는 여러 가지 대안이 있습니다. 또한 프로젝트 디스플레이와 같은 것들을 하위 구성 요소로 추상화하는 것을 고려할 수도 있습니다. 이와 같이 더 작은 더미 구성 요소로 내용을 분리하는 것은'* ngFor' 지시어의 내용에 공통적 인 패턴입니다. –