javascript - Hierarki for flere komponenter i Angular?


Når det gjelder dette spørsmålet har jeg sett på siden for Master/Detail-komponenter, men det er ikke nok informasjon om dette. I tillegg finnes det også en annen flott veiledning for Angular-mappehierarki på Angular Folder Structure, men den dekker heller ikke spørsmålet mitt.

Jeg har tre komponenter (la oss kalle dem) ComponentA, ComponentB og ComponentC, og jeg ønsker å slå dem alle sammen i en annen komponent kalt ComponentX, som vist på bildet. Siden dataene er forskjellige for hver av de tre komponentene, må jeg skille dem alle med tre komponenter med følgende hierarki:

-KomponentX (mappe)

    -ComponentA (folder)
        -componentA.html
        -componentA.ts
        -componentA.model.ts

    -ComponentB (folder)
        -componentB.html
        -componentB.ts
        -componentB.model.ts

    -ComponentC (folder)
        -componentC.html
        -componentC.ts
        -componentC.model.ts

    -componentX.html
    -componentX.ts
    -componentX.model.ts ???

Er denne hierarki-tilnærmingen korrekt? På den annen side, hvis Komponent X bare er et panel, kan vi bruke componentX.model.ts hvis en modell av data som brukes for generell bruk for alle 2 eller 3 komponenter (A, B og C) må hentes? Hvilken tilnærming bør jeg følge? Og hva er den beste måten for å dele data mellom to komponenter, dvs. master-detalj? tjeneste eller input-output tilnærming? Enhver hjelp ville bli satt pris på...

Svar #1

Jeg forteller deg hvordan jeg ville ha gjort det, men det er subjektivt, så vurder å bruke dette hvis det passer for deg, ellers kan du gjerne bruke noe annet.

Det jeg ville gjort er å lage et grensesnitt (eller hvis komponentene er nesten identiske, en superklasse) slik:

export interface ComponentX {
  title: string;
  data: any[];
  headers: string[];
}

Nå må komponentene dine implementere det, og de kan alle bruke samme mal/stil :

@Component({
  selector: 'comp-A',
  templateUrl: '../component-X.component.html',
  styleUrls: ['../component-X.component.scss']
})
export class ComponentA implements ComponentX {
  title = 'Component A';
  data = [];
  headers = ['ID', 'full name', 'phone number'];
}

På denne måten vil alle komponentene dine bli tvunget til å ha egenskapene til grensesnittet ditt, og siden egenskapene vil forbli de samme, vil du bare trenge én mal/CSS-fil.

Mappestrukturen ville se slik ut (igjen, hvis det var mitt problem):

ComponentX
|
|- componentX.component.html
|- componentX.component.ts
|- componentX.component.scss
|
|- ComponentA
|  |- componentA.component.ts
|
|- ComponentB
|  |- componentB.component.ts
|
|- ComponentC
   |- componentC.component.ts