Deleting object from Angular service

GluePear

I have a service in an Angular 2 app, events.service.ts:

const EVENTS = {
  1512205360: {
    event: 'foo'
  },
  1511208360: {
    event: 'bar'
  }
}

@Injectable()
export class EventsService {
  getEvents() {
    return EVENTS;
  }
  deleteEvent(timestamp) {
    delete EVENTS[timestamp];
  }
}

I have a home component which calls this service's getEvents method in its ngOnInit hook:

getEvents(): void {
    this.events = this.eventsService.getEvents();
    this.eventKeys = Object.keys(this.events);
}

ngOnInit(): void {
    this.getEvents();
}

The home component's template simply loops over the events and prints them out, with a delete icon next to each one:

<event *ngFor="let eventKey of eventKeys" [timestamp]="eventKey" [title]="events[eventKey].event"></event>

This is the event component:

@Component({
  selector: 'event',
  templateUrl: './event.component.html',
  providers: [EventsService]
})
export class EventComponent {
  @Input() timestamp: string;
  @Input() title: string;
  constructor(private eventsService: EventsService) { }

  deleteEvent(timestamp) {
    this.eventsService.deleteEvent(timestamp);
  }
}

Clicking the delete icon calls the deleteEvent method in the events service. My problem is that when I click the delete icon, although I can see that the event has been deleted (by console.logging the EVENTS object), the home component isn't updated and produces this error:

Cannot read property 'event' of undefined

dhilt

The point is that HomeComponent.eventKeys array does not linked with HomeComponent.events object which is linked with EVENTS. You set HomeComponent.eventKeys array one time on start of the HomeComponent via Object.keys(). All operations with HomeComponent.events (and EVENTS) do not affect HomeComponent.eventKeys array. So ngFor continues tracking the initial keys array and blows up on unexisted events item.

There are many possible solutions, but the main idea is to sync HomeComponent.eventKeys with EVENTS. This could be done, for example, via passing a delete-method from the HomeComponent to the EventComponent and recalculating the eventKeys array after deletion:

// HomeComponent
deleteEvent(timestamp) {
  this.eventsService.deleteEvent(timestamp);
  this.getEvents();
}

UPDATE

Just created a plunk demo for this situation, enjoy: https://plnkr.co/edit/ogfmEY?p=preview

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Deleting an object in Angular NGXS

From Dev

Deleting object from the url

From Dev

Pass JSON object from Angular service to directive

From Dev

Angular js , passing object from service

From Dev

How to return an object from angular service to controllers

From Dev

Getting an object array from an Angular service

From Dev

Deleting from array via object

From Dev

Deleting an object from a array in javascript

From Javascript

Deleting from an object using JavaScript

From Dev

Deleting the property from an object is not working

From Dev

Deleting element from a long object

From Dev

deleting an object from an array [java]

From Dev

Deleting object from state array

From Dev

Deleting object from a view in Django

From Dev

Deleting a file object from a library

From Dev

JS - deleting object from array

From Dev

Deleting stored observable value in angular service

From Dev

Deleting items from list in angular

From Dev

Deleting a message from Azure Queue Service by value

From Dev

Deleting an object of a nested data in Angular using NGXS

From Dev

Angular service returning object?

From Dev

Angular8 - object returned from service, sort and display

From Dev

How to subscribe object from service in Angular 2/5?

From Dev

passing object from one component to another using service file in angular

From Dev

Angular: Printing returned object in html coming from api service

From Dev

Complex object of Service changes from component after returning from service function in angular 5

From Dev

Error deleting json object from array in Postgres

From Dev

Deleting move constructor and constructing object from rvalue

From Dev

Deleting single object from array of objects

Related Related

HotTag

Archive