angular - Hur man startar om ngOnInit för att uppdatera interpolering


Finns det ett sätt att starta om ngOnInit() när en variabel ändras

Eftersom jag vill starta om ngOnInit() när theme-variabeln ändras, är detta min kod

Settings.ts

export class SettingsPage implements OnInit{
  phraseColor: string;
  ngOnInit() {
    let tch : {} = {'#3f51b5': 'Blue', '#ff9800': 'Orange'}
    let ColorName =  tch[this.settingsService.theme]; /* here my problem */
    this.phraseColor = ColorName;
  }
  changeTheme(){
    this.settingsService.theme = '#ff9800';
  }
}

Inställningar.html

<div>Theme is {{ phraseColor }}</div>
<button (click)="changeTheme()">Change language</button>

Mitt problem med phraseColor-variabeln

Standardvärdet för phraseColor är Blå

när jag ändrar theme-variabeln med changeTheme() ska värdet av phraseColor vara Orange

Men nej, värdet på phraseColor förblir Blå

Men när jag går till någon sida och återvänder till den här sidan är värdet på phraseColor Orange

Min fråga är hur man startar om ngOnInit för att uppdatera interpolering

theme-variabeln från denna sida SettingsService.ts

export class SettingsService {
  theme: string = '#3f51b5';
}

Svar #1

ngOnInit är en livscykelkrok. Den körs av ramverket och är inte avsedd att anropas manuellt. Klassen bör omstruktureras för att inte kräva det.

Med tanke på att settingsService.theme inte ändras godtyckligt utan endast med changeTheme, kan värden uppdateras där:

  ngOnInit() {
    this.updateColor();
  }

  changeTheme(){
    this.settingsService.theme = '#ff9800';
    this.updateColor();
  }

  updateColor() {
    let tch : {} = {'#3f51b5': 'Blue', '#ff9800': 'Orange'}
    let ColorName =  tch[this.settingsService.theme];
    this.phraseColor = ColorName;
  }

Om settingsService.theme förväntas ändras någon annanstans, kräver tjänsten en RxJS observable/subject för att kunna meddela prenumeranterna:

export class SettingsService {
  theme: Subject = new BehaviorSubject('#3f51b5'); 
}

Det kan prenumereras på i komponenten:

  themeSubscription: Subscription;

  ngOnInit() {
    this.themeSubscription = this.settingsService.theme.subscribe(theme => {
      let tch : {} = {'#3f51b5': 'Blue', '#ff9800': 'Orange'}
      //  immediate value is also available as this.settingsService.theme.value
      let ColorName =  tch[theme];
      this.phraseColor = ColorName;
    });
  }

  ngOnDestroy() {
    this.themeSubscription.unsubscribe();
  }

  changeTheme(){
    this.settingsService.theme.next('#ff9800');
  }