2017-04-16 17 views
5

Po przeczytaniu tego section about component interaction - Zauważyłem, że istnieje inny sposób komunikowania się z dzieckiem do rodziców (co nie było tam naprawdę udokumentowane):Angular - nieudokumentowana komunikacja między dziećmi?

Okazuje się, że jeśli Mam klasy nadrzędnej:

@Component({ 
    selector: 'my-app', 
    template: ` 
    <div> 
     <h2>Hello {{name}}</h2> 
     <my-item></my-item> 
    </div> 
    `, 
}) 
export class App { 
    name:string; 
    go1() 
    { 
    alert(2) 
    } 
    constructor() {} 
} 

a w składniku dziecięcej - I wstrzyknąć typ parent w ctor:

@Component({ 
    selector: 'my-item', 
    template: ` 
    <div> 
    <input type="button" value='invoke parent method' (click) = "myGo()"/> 
    </div> 
    `, 
}) 
    class MyItem { 
    name:string; 
    private parent1 : App; 

    myGo() 
    { 
    this.parent1.go1() //<--- access is available here 
    } 

    constructor(private parent1 : App) 
    { 
    this.parent1 = parent1; //<------------ manually, unlike service 
    this.name = `Angular! v${VERSION.full}` 
    } 
} 

Następnie kątowa widzi, że mam spróbować ing, aby wstrzyknąć rodzicielską klasę typu i daje mi do niej dostęp.

Kliknięcie działa oczywiście.

Pytanie:

Obok innych alternatyw, które już znam, jest to udokumentowane w dowolnym miejscu? czy jest to tylko cecha, że ​​nie mogę liczyć na to

plnkr

+0

Jeśli nie jest to udokumentowane, nie będę na nim polegać. Można go zmienić w następnym wydaniu drugorzędnym, ale nie jest on wymieniony jako zmiana zerwania ... – fredrik

Odpowiedz

3

To działa dobrze i może być używany.

Główną wadą jest to, że łamie hermetyzację. Komponent potomny musi wiedzieć o komponencie nadrzędnym. To podejście sprawia, że ​​dziecko jest ściśle powiązane z rodzicem, co zwykle uważa się za złe, ponieważ zapobiega ponownemu wykorzystaniu komponentu w dowolnym miejscu w aplikacji, ponieważ teraz działa tylko jako dziecko tego właśnie rodzica.

+0

Zgadzam się. Chciałem tylko wiedzieć, czy jest bezpieczny w użyciu (ponieważ nie jest to udokumentowane). Dziękuję Ci. –

+1

Poza tym jest to bezpieczne. Jeśli masz komponent 'TabPanel' i' TabComponent', który ma być używany tylko z 'TabPanel', nie ma IMHO nic, co przemawia przeciwko użyciu tego podejścia. –

+0

@ GünterZöchbauer wszystko, co jest nieudokumentowane, może zostać zmienione bez powiadomienia, nie sądzę, że jest to coś, na czym można polegać. – fredrik

Powiązane problemy