2

I have a list of items that is set in the service and is called in the ngOnInit():

async ngOnInit(){
   this.items = await this.service.getItems();
}

and this list is rendered using the directive *ngfor.

However, now I need to refresh the items list when there is any change in a variable. So I need an event that runs only when a certain variable (lets called it itemCategories) changes its value lets.

How can I achieve this?

Angular version is 12 and I am new to this

2
  • 1
    When does this variable will change? does it change based on certain input to a text field or selection from a dropdown list? please explain more. Commented Dec 19, 2021 at 14:34
  • The variable comes from an API and the trigger to its change is done in other component (dropdown menu). Commented Dec 19, 2021 at 16:51

3 Answers 3

4

fill your data in behaviourSubject then subscribe to it, now your behaviourSubject method will be called whenever you data get changed, here is an example:

I declare my behaviourSubject like these:

  private _resetForm$ = new BehaviorSubject<boolean>(false);


      public set setResetForm(resetStatus: boolean) {
        this._resetForm$.next(resetStatus);
      }
    
      public get resetForm(): Observable<boolean> {
        return this._resetForm$.asObservable();
      }

then I change it here:

  this.setResetForm = true;

now i will get event from here because setResetForm have changed so i will get my event from it:

  ngOnInit(): void {
    this.resetForm.subscribe((res: boolean) => {
      if (res) {
        console.log(res);
      }
    });
  }

good luck!

Sign up to request clarification or add additional context in comments.

Comments

1

You can use the EventEmitter and @Output() to achieve your goal.
Dropdown menu component:

import { Component,  Output, EventEmitter, NgModule } from '@angular/core';
@Component({
  selector: 'app-dropdown',
  template: `
    <div>
      <select [(ngModel)]="selected" (ngModelChange)="onChange($event)">
        <option *ngFor="let category of categories" [value]="category">{{category}}</option>
      </select>
    </div>`
})
export class DropdownComponent {
  @Output() selectedCategory: EventEmitter<string> = new EventEmitter<string>();
  categories = ["All categories", "A", "B", "C"]; //your categories list
  selected: string = "All categories"; //default value 
  constructor() {
  }

  onChange(newvalue): void {
    this.selectedCategory.emit(newvalue);
  }

}  

Here is the other component that will receive the selected value whenever it changes from the dropdown component

import {Component, NgModule} from '@angular/core'
@Component({
  selector: 'app-main',
  template: `
    <div>
      <app-dropdown (selectedCategory)='onChange($event)'></app-dropdown>
    </div>
  `,
})
export class MainComponent {
  selected: string;
  constructor() {
  }

  onChange(category):void {
    this.selected = category;
    //get your items list based on the selected category
  }
}  

Comments

0

Based on your short explanation here is a general solution:

wrap your items assignment in a method and call this method when you set the itemCategories value.

async ngOnInit(){
   this.setItems();
}

setItems(){
   this.items = await this.service.getItems();
}

setItemCategories(value){
   this.itemCategories = value;
   this.setItems();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.