I have a table that shows information, upon clicking on a table row, user can update the values once he completes the request, the table is not updated with the new values and I must do an F5 to refresh the view.
How do I force a new get request upon completing the request
here is the relevant code
MY SERVICE
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import {Observable} from 'rxjs/Rx';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
// Import RxJs required methods
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import { Device } from '../model/Device';
@Injectable()
export class DeviceService {
devices$: BehaviorSubject<Device[]>;
constructor(private http : Http) {
this.initializeDevices();
}
initializeDevices() {
var url = "./api/read/network/device";
//var url = '../assets/data/devices.json';
if (!this.devices$) {
this.devices$ = <BehaviorSubject<Device[]>> new BehaviorSubject(new Array<Device>());
this.http.get(url)
.map((res:Response) => res.json())
.subscribe(devices => {
this.devices$.next(devices);
});
}
}
subscribeToDevices(): Observable<Device[]> {
return this.devices$.asObservable();
}
}
my component
import { Component, OnInit, ViewChild } from '@angular/core';
import { DeviceService } from '../../services/device.service';
import { MacService } from '../../services/mac.service';
import { Device } from '../../model/Device';
@Component({
selector: 'app-device-table',
templateUrl: './device-table.component.html',
styleUrls: ['./device-table.component.sass']
})
export class DeviceTableComponent implements OnInit {
devices;
//reference to the datatable needed to count filtered rows
@ViewChild
('dt') dt;
constructor(private deviceService : DeviceService, private macService : MacService) { }
ngOnInit() {
this.registerEvents();
this.getDevices();
}
getDevices(){
this.deviceService.subscribeToDevices().subscribe(
devices => this.processDevices(devices),
error => console.log(error)
);
}
processDevices(devices){
//just data manipulation
}
emitShowDialogEvent(device) {
if(!device.macAddress) {
return;
}
this.macService.broadcastShowDialogEvent(device.macAddress);
}
registerEvents(){
this.macService.dataChangedEvent.subscribe(event =>{
console.log('data changed event');
this.getDevices(); //not provoking a new GET request to the API :(
});
}
}
I have another component, MACService, that upon sending a POST request emits an event that is captured as dataChangedEvent
Two ways you can use.
One is call GET request inside POST subscribe event.
this.guardianService.editGuardian(this.guardData).subscribe(res=> {
this.loadData(); // this is function who makes GET request
});
The other way is to use ReplaySubject.
private subject: Subject<any> = new ReplaySubject<any>(1);
get $getSubject(): Observable<any> {
return this.subject.asObservable();
}
loadData() {
this._http.get(url, header)
.map(x=>x.json())
.subscribe(data=> {
this.subject.next(data);
});
}
postData(data) .....
This is Service. Here here goes component
this.serviceHandle.$getSubject.subscribe(res => {
//here goes any thing you want to do.
});
this.serviceHandle.loadData(); // this function will make reqeust
this._accountService.editAccountData(account).subscribe(res=> {
this.serviceHandle.loadData();
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With