Вместо того, чтобы использовать слишком много логики в ваших шаблонах, вы можете легко объединить данные внутри вашего ContactsService
в соответствии с вашими потребностями.
Примером может быть использование combineLatest
для получения данных JSON изатем предоставьте вашему клиенту назначения.
@Injectable({ providedIn: 'root' })
export class ContactsService {
private appointmentsData$ = this.http.get<IAppointments[]>(APPOINTMENTS_URL);
private customersData$ = this.http.get<ICustomer[]>(CUSTOMERS_URL);
public readonly customers$ = combineLatest(this.appointmentsData$, this.customersData$).pipe(
map(([appointments, customers]) => {
return customers.map(customer =>
{
return {
...customer,
appointments: appointments.filter(appointment =>
{
return appointment.customerIds.indexOf(customer.id) > -1;
})
}
})
})
);
constructor(private http: HttpClient) { }
}
Затем вы можете использовать наблюдаемую customers$
внутри вашего компонента и использовать async
-pipe для его перебора внутри шаблона:
@Component({
selector: 'app-list',
templateUrl: './list.component.html',
styleUrls: ['./list.component.css']
})
export class ListComponent {
public customers$ = this.contactsService.customers$;
constructor(private contactsService: ContactsService) { }
}
<div class="main-div">
<div *ngFor="let customer of customers$ | async">
<p><b>Name:</b> {{customer.name}}</p>
<h3>Appointments</h3>
<ul>
<li *ngFor="let appointment of customer.appointments">
{{ appointment.appointmentName }}
</li>
</ul>
</div>
</div>
DEMO