Angular 2: Failure to Update View after Array Modification

My project includes 2 components:

collection.component.ts

import { Component, OnInit } from '@angular/core';
import { CollectService } from '../collect.service';
import { Collectable } from '../collectable.model';
import {Observable} from 'rxjs/Rx';

@Component({
  selector: 'app-collection',
  templateUrl: './collection.component.html',
  styleUrls: ['./collection.component.css'],
  providers: [CollectService]
})
export class CollectionComponent implements OnInit {

  market: Collectable[] = [];
  constructor(private _collectService: CollectService) { }

  ngOnInit():any {
    this._collectService.getMarket().then((collectable: Collectable[]) => {this.market = collectable});
  }

  remove(item: Collectable) {
    this._collectService.removeFromMarket(item);
  }

}

collection.component.html

<div class="row">
  <div class="col-xs-12">
    <ul class="list-group" *ngIf="market.length > 0">
      <li class="list-group-item" *ngFor="let item of market">
        <span class="badge">{{item.name}}</span>&nbsp;
        <button class="btn btn-danger" (click)="remove(item)">Remove from Collection</button>
        {{item.desc}}
      </li>
    </ul>
    <h3 *ngIf="market.length === 0">Start adding items first!</h3>
  </div>
</div>

market.component.ts

import { Component, OnInit } from '@angular/core';
import { CollectService } from '../collect.service';
import { Collectable } from '../collectable.model';
@Component({
  selector: 'app-market',
  templateUrl: './market.component.html',
  styleUrls: ['./market.component.css'],
  providers: [ CollectService ]
})
export class MarketComponent implements OnInit {

  array: Collectable[] = [];  

  add(item) {
    this._collectService.addToMarket(item);
  }

  constructor(private _collectService: CollectService) { }

  ngOnInit() {
    this.array = this._collectService.getCollectable();
  }

}

market.component.html

<div class="row">
  <div class="col-xs-12">
    <ul class="list-group">
      <li class="list-group-item" *ngFor="let item of array">
        <span class="badge">{{item.name}}</span>&nbsp;
        <button class="btn btn-success" (click)="add(item)">Add to Collection</button>
        {{item.desc}}
      </li>
    </ul>
  </div>
</div>

contact.service.ts

import { Injectable } from '@angular/core';
import { Collectable } from './collectable.model';
@Injectable()
export class CollectService {

  private array: Collectable[] = [
    new Collectable ('jQuery', 'A good framework!'),
    {name: 'HTML', desc: 'A basic for web development!'},
    {name: 'CSS', desc: 'A styling weapon!'},
    {name: 'BootStrap', desc: 'A styling framework!'},
    {name: 'Angular', desc: 'A SPA framework!'},
    {name: 'React', desc: 'A SPA library!'},
    {name: 'Redux', desc: 'Go find yourself!'},
  ];

  private market: Collectable[] = [];

  public getCollectable() {
    return this.array;
  }

  public getMarket() {
    return Promise.resolve(this.market);
  }

  addToMarket(item: Collectable) {
    if (this.market.indexOf(item) == -1) {
      Promise.resolve(this.market).then((collection: Collectable[])=>{
        this.market.push(item);
      });
      console.log('Added item : ' + item.name + ' Desc : ' + item.desc);
    }
    console.log("Array entries : ");
    for(let item2 of this.market){
      console.log('Added item : ' + item2.name + ' Desc : ' + item2.desc);
    }
  }

  removeFromMarket(item: Collectable) {
    this.market.splice(this.market.indexOf(item), 1);
  }
  constructor() { }

}

I am currently working on a feature where I can move items from the market to the collection and then have an option to remove them from the collection as well.

Update : Upon investigating further, I noticed that the service data is not being retained when switching between components. Any suggestions on what might be causing this issue?

Answer №1

When you include the CollectService in your component, a new instance will be created and destroyed each time the component is instantiated.

To ensure consistent lifetime of the service, either provide it at a higher level parent component or declare it as a global singleton by including it in the NgModule.

@NgModel({
  providers: [CollectService],
  ...
})
export class AppModule {}

Similar questions

If you have not found the answer to your question or you are interested in this topic, then look at other similar questions below or use the search

Exploring the capabilities of the Angular 2 HTTP service

I am just beginning my journey with Angular 2. Here is a service I have created: @Injectable() export class PostsService { constructor(private http: Http) { } getAllPosts() { return this.http.get('/api/posts') .map ...

Angular 6 - Preload service with asynchronous requests prior to injecting dependencies

I've encountered an issue with my service that loads a configuration object in memory based on the environment file. The problem is that the settings are read asynchronously, causing the application to start before all settings are loaded and resultin ...

React - The `component` prop you have supplied to ButtonBase is not valid. Please ensure that the children prop is properly displayed within this customized component

I am attempting to use custom SVG icons in place of the default icons from Material UI's Pagination component (V4). However, I keep encountering this console error: Material-UI: The component prop provided to ButtonBase is invalid. Please ensure tha ...

Nested loop with Angular and Bootstrap Modal

I am trying to implement a Modal in Angular to display the details of a row in a table with matching IDs, but I'm encountering an issue where only the data from the first row is shown when I open the Modal. The other rows do not seem to work correctly ...

What steps can I take to ensure Angular 8 is compatible with IE11?

After upgrading to Angular 8 with the ng update command, it initiated migration scripts that removed the es6/es7 imports from the polyfills.ts file. I had read that Angular would generate a special build for older browsers, such as IE11, eliminating the ne ...

Using Angular to transfer changed data between two tables

Seeking guidance on implementing an angular change strategy involving the PatientData and ChangeLog tables. PatientData table { name: "John", price: 10, ... } When changing the price from 10 to 15 in the PatientData table, I w ...

Learn how to iterate through a response and combine the array if a second array exists by utilizing ES6 functionalities

[ { "details": { "name": "john", "point": "20" }, "list": { "number": "30", } }, { "details": { "name": "doe", "point": "25" }, "list": { "number": "30", } } ] Upon receiving a ...

Having troubles with angular due to doodle throwing errors?

https://codepen.io/tuckermassad/pen/rPYNLq I took the CSS doodle code from the above link and incorporated it into my angular component: <section class="main"> <css-doodle grid="5"> :doodle { @grid: 10 / 100%; } ...

Transfer a value to the ng2 smart table plugin extension

Upon reviewing the document and source code related to pagination implementation in the (advanced-example-server.component.ts), I discovered that the ServerDataSource being used only supported pagination through HTTP GET (_sort, _limit, _page, etc paramete ...

Using TypeScript 3.0 alongside React defaultProps

If I define a prop in the following way: interface Props { Layout?: LayoutComponent; } Then, if I set defaultProps on a ClassComponent: class MyComp extends React.Component<Props> { static defaultProps: Pick<Props, 'Layout'> = ...

When using Angular 2's HTTP POST method, it initiates an OPTIONS request

I've come across a peculiar issue with my Angular 2 application. I'm trying to send a JSON via a POST call to my Play Scala API, but it keeps attempting to make an OPTIONS request. Below is the code snippet : LoginService constructor (private ...

Navigating to native script, the method for extracting an ID from a link is revealed

Is there a way to extract the unique identifier from this URL: I want to retrieve the code "11E89887FABBC1D" when clicking on the link. Any suggestions? ...

Exploring the concepts of Indigenous Unity within Angular 17

Currently, I am handling a project in Angular 17 that implements the micro frontend concept, specifically utilizing Native Federation. I have followed the instructions provided on the official website, and everything is functioning correctly. However, I am ...

What prevents me from extending an Express Request Type?

My current code looks like this: import { Request, Response, NextFunction } from 'express'; interface IUserRequest extends Request { user: User; } async use(req: IUserRequest, res: Response, next: NextFunction) { const apiKey: string = ...

Connecting two divs with lines in Angular can be achieved by using SVG elements such as

* Tournament Brackets Tree Web Page In the process of developing a responsive tournament brackets tree web page. * Connection Challenge I am facing an issue where I need to connect each bracket, represented by individual divs, with decorative lines linki ...

After updating to Angular 9, the ViewChild functionality seems to be malfunctioning

Is there a change in ViewChild behavior? Since upgrading to Angular 9, the MatSideNav menu has ceased to function. export class SidenavOpenCloseExample implements OnInit, AfterViewInit { @ViewChild('menuSide', {read: MatSidenav, static: true} ...

"Transform the appearance of the datepicker input field with Material 15's dynamic

I am in need of assistance to change the color to white for the input date and add an underline to a datepicker element <mat-form-field class="date-criteria-select " [floatLabel]="'always'"> <mat-label class=" ...

Utilize the type constant to retrieve a specific value in typescript

Is it possible to retrieve the constant value from the type with this specific definition? type Dummy = { type: "dummy" } For instance, something along the lines of Extract<Dummy["type"]> ...

Test indicator: Display outcomes solely for successful tests

I am currently utilizing Angular with the Karma test runner, however, I am finding that there are an excessive number of logs being generated. https://i.sstatic.net/ea5FB.png Is there a way for me to display only the test results without any additional l ...

Seasonal calendar selector

Currently, I am searching for a Quarterly date picker utilizing ng-bootstrap. Right now, I already have a Month and Year picker, as shown in this STACKBLITZ, but my goal is to switch the Month to Quarter. https://i.sstatic.net/1kWN3.png Can ng-bootstrap ...