typescript - Angular 8: Markera formulär som berört från föräldrakomponent
Hur deklarerar jag ett barnkomponentformulär som markerat som berört från en föräldrakomponent?
För närvarande har vi i barnkomponenten en ingångsvariabel och ngOnChanges som fungerar
@Input public markFormTouchedFlag: boolean
if (this.markFormTouchedFlag) {
this.addressform.markAllAsTouched();
}
Nyfiken på om det finns ett mer effektivt sätt att markera ett formulär i en barnkomponent (addressform) som berört från en föräldrakomponent?
Kanske borde göra frågan mer generell, hitta formvaliditet, markera som oredigerad, men jag kommer att hålla mig till den första frågan endast.
Svar #1
Du kan göra detta på ett mer improviserat sätt om du behöver skicka samma variabel ("markFormTouchedFlag") till flera komponenter kan du använda denna metod. Denna metod lagrar data i observable och genom att prenumerera på detta kommer variabeln automatiskt att uppdateras varhelst den används.
skapa tjänst för att lagra data:
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
@Injectable({ providedIn: 'root' })
export class FlagService {
private subject = new Subject<any>();
updateFlag(flag: bool) {
this.subject.next({ flag: flag });
}
setFlag() {
this.subject.next();
}
getFlag(): Observable<any> {
return this.subject.asObservable();
}
}
skapa föräldrakomponent:
import { Component, OnDestroy } from '@angular/core';
import { Subscription } from 'rxjs';
import { FlagService } from '../services/FlagService.service';
@Component({
selector: 'app',
templateUrl: 'app.component.html'
})
export class AppComponent implements OnDestroy {
flag: any;
subscription: Subscription;
constructor(private flagService: FlagService) {}
setFlag(): void {
this.flagService.setFlag(flag);
}
clearFlag(): void {
this.messageService.clearMessage();
}
}
I denna komponent (föräldrakomponent) har vi två funktioner: set och clear flag. Setflag-funktionen används för att sätta värdet i tjänsten. När det har satts i tjänstelagret kommer det att uppdateras överallt där värdet är prenumererat. clearFlag-funktionen används för att sätta variabeln till ett null-värde.
barnkomponent:
import { Component } from '@angular/core';
import { FlagService } from '../services/FlagService.service';
@Component({ templateUrl: 'home.component.html' })
export class HomeComponent {
flag: any;
subscription: Subscription;
constructor(private flagService: FlagService) {
this.subscription = this.flagService.getFlag().subscribe(flag => { this.flag = flag; });
}
ngOnDestroy() {
this.subscription.unsubscribe();
}
Genom detta kan du hämta värdet från observable; när flaggan ändras i tjänsten uppdateras den automatiskt i barnkomponenten när den ändras i föräldrakomponenten och den sätts till flaggan i komponenten på grund av prenumerationen som gjorts i konstruktorn.
när komponenten förstörs avregistrerar vi oss för värdet.
