Issue
After creating an API Backend with Django i tried to get an Angular Component to display the data provided to create a list of all fetched datasets.
I was able to get an test in service.spec.ts running and i got validated that the data is correctly fetched from the backend
I am struggling a bit with angular v.17 syntax so maybe the problem is quite simple.
Here is the code:
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ProjectDashboardService } from './project-dashboard.service' ; // Updated import path
import { Project } from './project.model'; // Updated import path
@Component({
selector: 'app-project-dashboard',
standalone: true,
imports: [CommonModule],
//templateUrl: './project-dashboard.component.html',
template:`
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<h5 class="card-header">Projekte</h5>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Projektname</th>
<th>Beschreibung</th>
<th>Level</th>
</tr>
</thead>
<tbody>
<tr>
<ng-template ngFor let-project [ngForOf]="projects">
<td>{{project.project_name}}</td>
<td>{{project.project_description}}</td>
<td>{{project.project_level}}</td>
</ng-template>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
`,
styleUrl: './project-dashboard.component.scss',
providers: [ProjectDashboardService] // Updated provider
})
export class ProjectDashboardComponent implements OnInit {
projects!: Project[]; // Updated type
projectDashboardService: ProjectDashboardService; // Declare projectDashboardService property
constructor(projectDashboardService: ProjectDashboardService) {
this.projectDashboardService = projectDashboardService; // Assign projectDashboardService in the constructor
}
ngOnInit() {
this.projectDashboardService.getProjectDashboardList()
.subscribe(projects => this.projects = projects);
}
}
in the end i would like to get an responsive page that shows all current projects fetched
Solution
Here is a working example to help you understand the implementation of this.
Few notes:
If you do
private projectDashboardService: ProjectDashboardServiceit is the short form of what you have in your existing code, no need to initialize the variable and then set the value!The
tr(row) should be used for*ngForbecause else it will be just a list of cells (td) without having their own separate rowsYou can just initialize the service in the providers, but you can also use
providedIn: rootso that the service is accessible to all parents if that is your requirement
main.ts
import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
import { CommonModule } from '@angular/common';
import { ProjectDashboardService } from './project-dashboard.service';
export interface Project {
project_name: string;
project_description: string;
project_level: string;
}
@Component({
selector: 'app-root',
standalone: true,
providers: [ProjectDashboardService],
imports: [CommonModule],
template: `
<div class="container">
<div class="row">
<div class="col-md-12">
<div class="card">
<h5 class="card-header">Projekte</h5>
<div class="card-body">
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>Projektname</th>
<th>Beschreibung</th>
<th>Level</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let project of projects; trackBy trackByFn">
<td>{{project.project_name}}</td>
<td>{{project.project_description}}</td>
<td>{{project.project_level}}</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
`,
})
export class App {
projects!: Project[]; // Updated type
constructor(private projectDashboardService: ProjectDashboardService) {}
ngOnInit() {
this.projectDashboardService
.getProjectDashboardList()
.subscribe((projects) => (this.projects = projects));
}
trackByFn(index: number, item: Project) {
return item.project_name;
}
}
bootstrapApplication(App);
Answered By - Naren Murali
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.