I have 3 tabs in which one tab shows a table with a list of employees. Works well when it loads for the first time .ngOnInit Retrieves data from the server using http get. After that, when I click add a new employee to open a form that accepts data from the user, and when this submission is clicked, I call a function that calls the http mail service to send this data to my server, where it inserts records, and then after that. it is redirected back to the employee component, but now that the employee component is already loaded, I do not see the new record inserted into the table until I recompile my code.
employee.component.ts (which loads the employee table)
import { Component, OnInit, OnDestroy } from '@angular/core'; import { EmployeeService } from '../employee.service'; @Component({ selector: 'app-employees', templateUrl: './employees.component.html', styleUrls: ['./employees.component.css'] }) export class EmployeesComponent implements OnInit { public employeeObj:any[] = [{emp_id:'',empname:'',joindate:'',salary:''}] ; constructor(private employeService:EmployeeService) { } ngOnInit() { this.employeService.getEmployees().subscribe(res => this.employeeObj = res); } }
form.component.ts
import { Component, OnInit, OnDestroy } from '@angular/core'; import { FormGroup, FormControl } from '@angular/forms'; import { EmployeeService } from '../../employee.service'; import { Router } from '@angular/router'; @Component({ selector: 'app-form', templateUrl: './form.component.html', styleUrls: ['./form.component.css'], }) export class FormComponent implements OnInit { empform; ngOnInit() { this.empform = new FormGroup({ empname: new FormControl(""), joindate: new FormControl(""), salary: new FormControl("") }) } constructor(private employeeService: EmployeeService, private router:Router) { } onSubmit = function(user){ this.employeeService.addEmployee(user) .subscribe( (response) => { this.router.navigate(['/employees']); } ); } }
employee.service.ts
import { Injectable } from '@angular/core'; import { Http, Response } from '@angular/http'; import 'rxjs/add/operator/map'; import 'rxjs/Rx'; @Injectable() export class EmployeeService{ constructor(private http:Http){} addEmployee(empform: any[]){ return this.http.post('MY_API',empform); } getEmployees(){ return this.http.get('MY_API').map((response:Response)=>response.json()); } }
AppModule.ts
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { ReactiveFormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http'; import { RouterModule } from '@angular/router'; import { EmployeeService } from './employee.service'; import { AppComponent } from './app.component'; import { HeaderComponent } from './header/header.component'; import { NavComponent } from './nav/nav.component'; import { ContainerComponent } from './container/container.component'; import { DashboardComponent } from './dashboard/dashboard.component'; import { EmployeesComponent } from './employees/employees.component'; import { CompaniesComponent } from './companies/companies.component'; import { InternsComponent } from './interns/interns.component'; import { FormComponent } from './employees/form/form.component'; import { ComformComponent } from './companies/comform/comform.component'; import { InternformComponent } from './interns/internform/internform.component'; @NgModule({ declarations: [ AppComponent, HeaderComponent, NavComponent, ContainerComponent, DashboardComponent, EmployeesComponent, CompaniesComponent, InternsComponent, FormComponent, ComformComponent, InternformComponent ], imports: [ BrowserModule, FormsModule, ReactiveFormsModule, HttpModule, RouterModule.forRoot([ { path:'dashboard', component:DashboardComponent }, { path:'employees', component:EmployeesComponent }, { path:'companies', component:CompaniesComponent }, { path:'interns', component:InternsComponent }, { path:'addemployee', component:FormComponent }, { path:'comform', component:ComformComponent }, { path:'internform', component:InternformComponent } ]) ], providers: [EmployeeService], bootstrap: [AppComponent] }) export class AppModule { }
The problem is that I call my API from ngOnInit, which loads fine the first time the component loads. When I submit the form, it is submitted to my API and then redirected back to the employee component, but the data is not updated as it should.
PS: I apologize for such a small post. I am new to this site.
Update:
It has been more than a year since I posted this thread, and I see that many people benefit from this, or maybe not. However, I would like to note that I already understood what caused the error, and now I will try to help you understand the solution.
The most important concept to adapt here is the corner hooks of the life cycle . What happens, we call ngOnInit the first time the component loads, and it only fires once when the corner application loads. It looks like a class constructor, but only fires once. Thus, you should not put here any modifications related to the DOM. You must understand the lifecycle corner hooks to solve this problem. I do not have a working solution, since I moved to Vujas from the last 8 months, but in my free time I will post an update here.