2015-10-15 24 views
8

Forse questa è una sorta di due domande in una. So che devi dichiarare esplicitamente le direttive da utilizzare all'interno di un Componente per Angular 2. Questo si propagherà ai componenti del componente figlio, e in caso contrario, può essere fatto per? Secondo, le variabili dichiarate sul componente si propagano ai bambini o devono essere passate esplicitamente al componente?ereditarietà direttiva/ambito

+1

Hanno in programma di implementare ciò che hai menzionato. [Vedi questo problema] (https://github.com/angular/angular/issues/2844). Tuttavia, continua a essere respinto, quindi dovrai aspettare. –

+0

Immagino che questo sia difficile da decifrare perché l'idea di modularità impone che un componente/modulo non abbia dipendenze implicite. Se dovessi spostare il componente figlio da qualche altra parte, si romperà. Questo di solito viene risolto con l'iniezione di ereditarietà o dipendenza, che crea un forte legame tra il bambino e il componente genitore e, a sua volta, rende il componente figlio impenetrabile a muoversi da solo. – jornare

+0

Suppongo che abbia senso allo stesso modo della programmazione funzionale quindi ... sfortunatamente significa che ho del lavoro da fare;) – djvs

risposta

2

A partire dalla versione beta.14 è necessario elencare in modo esplicito tutte le direttive utilizzate nell'array directives@Component. Per la seconda parte della domanda, le variabili dichiarate sul componente (ad esempio: this.name) non vengono propagate ai componenti figlio. Per ottenere questo è necessario passarli esplicitamente nel modello di componenti utilizzando attributi come <child [item]="parentItem"></child> e il componente figlio deve contenere la proprietà @Input item.

EDIT: Per incorporare chiarimenti commento ... E 'possibile registrare le direttive a livello globale, ma solo in funzione di bootstrap. Le direttive dichiarate sul genitore saranno NON ereditate dal componente figlio.

bootstrap(App, [ 
    PLATFORM_DIRECTIVES, 
    provide(PLATFORM_DIRECTIVES, {useValue: [SomeDirective, SomeComponent], multi:true}) 
]); 
+0

Puoi rendere i direttori disponibili globalmente con 'provide (PLATFORM_DIRECTIVES, {useValue: [SomeDirective, SomeComponent], multi: true}) ', lo stesso con pipe' bootstrap (App, [fornire (PLATFORM_PIPES, {useValue: RainbowizePipe, multi: true})]); ' –

+0

Grazie per il chiarimento – tomastrajan