Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ng g c components/add-student
ng g c components/student-details
ng g c components/students-list
Ahora puede ver que la estructura de directorio de nuestro proyecto se ve así.
Imagen de proyecto
Déjame explicarte brevemente.
- Hay 3 componentes: students-list, students-details, add-student.
- student.service tiene métodos para enviar solicitudes HTTP a las Apis.
- app-routing.module.ts define rutas para cada componente.
- el appcomponent contiene la vista del enrutador y la barra de navegación.
- app.module.ts declara los componentes de Angular e importa los módulos
necesarios.
...
import { FormsModule } from '@angular/forms';
import { HttpClientModule } from '@angular/common/http';
@NgModule({
declarations: [ ... ],
imports: [
...
FormsModule,
HttpClientModule
],
providers: [],
bootstrap: [AppComponent]
})
export class AppModule { }
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
<div>
<nav class="navbar navbar-expand navbar-dark bg-dark">
<a href="#" class="navbar-brand">AppName</a>
<div class="navbar-nav mr-auto">
<li class="nav-item">
<a routerLink="students" class="nav-link">Students</a>
</li>
<li class="nav-item">
<a routerLink="add" class="nav-link">Add</a>
</li>
</div>
</nav>
@Injectable({
providedIn: 'root'
})
export class StudentService {
getAll(): Observable<any> {
return this.http.get(baseUrl);
}
get(id): Observable<any> {
return this.http.get(`${baseUrl}/${id}`);
}
create(data): Observable<any> {
return this.http.post(baseUrl, data);
}
delete(id): Observable<any> {
return this.http.delete(`${baseUrl}/${id}`);
}
deleteAll(): Observable<any> {
return this.http.delete(baseUrl);
}
findByTitle(title): Observable<any> {
return this.http.get(`${baseUrl}?title=${title}`);
}
}
@Component({
selector: 'app-add-student',
templateUrl: './add-student.component.html',
styleUrls: ['./add-student.component.css']
})
export class AddStudentComponent implements OnInit {
student = {
title: '',
description: '',
published: false
};
submitted = false;
ngOnInit(): void {
}
saveStudent(): void {
const data = {
title: this.student.title,
description: this.student.description
};
this.studentService.create(data)
.subscribe(
response => {
console.log(response);
this.submitted = true;
},
error => {
console.log(error);
});
}
newStudent(): void {
this.submitted = false;
this.student = {
title: '',
description: '',
published: false
};
}
}
componentes / add-student / add-student.component.html
<div style="width: 400px; margin: auto;">
<div class="submit-form">
<div *ngIf="!submitted">
<div class="form-group">
<label for="title">Title</label>
<input
type="text"
class="form-control"
id="title"
required
[(ngModel)]="student.title"
name="title"
/>
</div>
<div class="form-group">
<label for="description">Description</label>
<input
class="form-control"
id="description"
required
[(ngModel)]="student.description"
name="description"
/>
</div>
<div *ngIf="submitted">
<h4>You submitted successfully!</h4>
<button class="btn btn-success" (click)="newStudent()">Add</button>
</div>
</div>
</div>
getAll()
deleteAll()
findByTitle()
componentes / lista -de -studentes / lista -de -studentes.component.ts
import { Component, OnInit } from '@angular/core';
import { StudentService } from 'src/app/services/student.service';
@Component({
selector: 'app-students-list',
templateUrl: './students-list.component.html',
styleUrls: ['./students-list.component.css']
})
export class StudentsListComponent implements OnInit {
students: any;
currentStudent = null;
currentIndex = -1;
title = '';
ngOnInit(): void {
this.retrieveStudents();
}
retrieveStudents(): void {
this.studentService.getAll()
.subscribe(
data => {
this.students = data;
console.log(data);
},
error => {
console.log(error);
});
}
refreshList(): void {
this.retrieveStudents();
this.currentStudent = null;
this.currentIndex = -1;
}
removeAllStudents(): void {
this.studentService.deleteAll()
.subscribe(
response => {
console.log(response);
this.retrieveStudents();
},
error => {
console.log(error);
});
}
searchTitle(): void {
this.studentService.findByTitle(this.title)
.subscribe(
data => {
this.students = data;
console.log(data);
},
error => {
console.log(error);
});
}
}
components / students-list / students-list.component.html
<div class="list row">
<div class="col-md-8">
<div class="input-group mb-3">
<input
type="text"
class="form-control"
placeholder="Search by title"
[(ngModel)]="title"
/>
<div class="input-group-append">
<button
class="btn btn-outline-secondary"
type="button"
(click)="searchTitle()"
>
Search
</button>
</div>
</div>
</div>
<div class="col-md-6">
<h4>Students List</h4>
<ul class="list-group">
<li
class="list-group-item"
*ngFor="let student of students; let i = index"
[class.active]="i == currentIndex"
(click)="setActiveStudent(student, i)"
>
{{ student.title }}
</li>
</ul>
get()
update()
delete()
components / student-details / student-details.component.ts
import { Component, OnInit } from '@angular/core';
import { StudentService } from 'src/app/services/student.service';
import { ActivatedRoute, Router } from '@angular/router';
@Component({
selector: 'app-student-details',
templateUrl: './student-details.component.html',
styleUrls: ['./student-details.component.css']
})
export class StudentDetailsComponent implements OnInit {
currentStudent = null;
message = '';
constructor(
private studentService: StudentService,
private route: ActivatedRoute,
private router: Router) { }
ngOnInit(): void {
this.message = '';
this.getStudent(this.route.snapshot.paramMap.get('id'));
}
getStudent(id): void {
this.studentService.get(id)
.subscribe(
data => {
this.currentStudent = data;
console.log(data);
},
error => {
console.log(error);
});
}
updatePublished(status): void {
const data = {
title: this.currentStudent.title,
description: this.currentStudent.description,
published: status
};
this.studentService.update(this.currentStudent.id, data)
.subscribe(
response => {
this.currentStudent.published = status;
console.log(response);
},
error => {
console.log(error);
});
}
updateStudent(): void {
this.studentService.update(this.currentStudent.id, this.currentStudent)
.subscribe(
response => {
console.log(response);
this.message = 'The student was updated successfully!';
},
error => {
console.log(error);
});
}
deleteStudent(): void {
this.studentService.delete(this.currentStudent.id)
.subscribe(
response => {
console.log(response);
this.router.navigate(['/students']);
},
error => {
console.log(error);
});
}
}
components / student-details / student-details.component.html
<div style="width: 400px; margin: auto;">
<div *ngIf="currentStudent" class="edit-form">
<h4>Student</h4>
<form>
<div class="form-group">
<label for="title">Title</label>
<input
type="text"
class="form-control"
id="title"
[(ngModel)]="currentStudent.title"
name="title"
/>
</div>
<div class="form-group">
<label for="description">Description</label>
<input
type="text"
class="form-control"
id="description"
[(ngModel)]="currentStudent.description"
name="description"
/>
</div>
<div class="form-group">
<label><strong>Status:</strong></label>
{{ currentStudent.published ? "Published" : "Pending" }}
</div>
</form>
<button
class="badge badge-primary mr-2"
*ngIf="currentStudent.published"
(click)="updatePublished(false)"
>
UnPublish
</button>
<button
*ngIf="!currentStudent.published"
class="badge badge-primary mr-2"
(click)="updatePublished(true)"
>
Publish
</button>
<button
type="submit"
class="badge badge-success"
(click)="updateStudent()"
>
Update
</button>
<p>{{ message }}</p>
</div>
<div *ngIf="!currentStudent">
<br />
<p>Cannot access this Student...</p>
</div>
</div>