di comment per la risposta See @ EricMartinez. Il problema sembra essere un riferimento circolare quando A importa B e B importa A.
Ecco uno plunker che utilizza due file anziché un file che si trova in Eric's plunker.
L'unico cambiamento dal mio plunker originale si trova nella ChildComponent:
import {Component, Inject, forwardRef} from 'angular2/core';
....
constructor(@Inject(forwardRef(() => AppComponent)) private _parent:AppComponent)
non so per certo se questo elimina il riferimento circolare, dal momento che A e B sono ancora importando un l'altro, ma sembra lavorare.
Vedi anche https://github.com/angular/angular/issues/3216, dove Miško afferma:
This [not user-friendly declaration using forwardRef()] is a limitation of JS and how the function declarations get hoisted. Whenever you have a circular dependency you will need forwardRef
:-(I just don't see a away around it.
I would argue that you should not be in situation where your parent needs to know about the children and children need to know about parent. @Query
should take care of most of the use cases.
I am sorry, but while I agree this is a pain in some rare cases, I don't see a way out of it, and hence this issue is not actionable, will close.
Hmm ... il motivo per cui ho cercato di iniettare il genitore era perché vedo due modi per un bambino di comunicare con un genitore:
- il figlio definisce proprietà di output ed emette eventi, che il genitore sottoscrive a
- il bambino inietta il genitore (ad esempio, Pane potrebbe inserire schede) e può quindi chiamare metodi sul genitore
E stavo cercando di determinare quando utilizzare ogni approccio. Miško fa sembrare 2. dovrebbe essere raro.
Aggiornamento: Ci stavo pensando un po 'di più ... 1. è migliore perché c'è meno accoppiamento tra il bambino e il genitore. Con 1. il bambino non ha bisogno di sapere (e probabilmente non dovrebbe sapere) l'API/interfaccia pubblica del genitore.
Nella direzione inversa (ad esempio, il genitore usa @ViewChild
(@Query
è ora deprecato) per ottenere un riferimento al figlio, quindi chiama i metodi sul figlio), l'accoppiamento va bene, perché il genitore sta usando il componente figlio, quindi ha bisogno di conoscere l'API/interfaccia pubblica del bambino: cioè, le proprietà di input e output e i metodi pubblici.
Mark, il problema è che quando si importa B da A e allo stesso tempo si importa A da B si crea una dipendenza circolare (non si può andare più in profondità sull'oggetto). Controlla questo [plnkr] (http://plnkr.co/edit/mXAbdBPqAqnHUAAi8Ohl?p=preview) con il tuo caso utilizzando un solo file che contiene sia i componenti figlio che i componenti padre. –
Grazie a @EricMartinez e grazie per tutti i tuoi altri commenti e risposte su Angular2 anche su SO. Imparo molto da te. –
Voglio ammendare una parola nel commento sopra. In realtà è un riferimento circolare (non so se è lo stesso o no, comunque ...). Ho chiesto la stessa cosa un po 'di tempo fa nella chat di TypeScript e ho ottenuto la mia risposta: [Puoi controllare qui] (https://gitter.im/Microsoft/TypeScript?at=565a25ab2753fafb4af5ecee) –