Tengo dos componentes de la siguiente manera y quiero llamar a una función desde otro componente. Ambos componentes se incluyen en el tercer componente principal mediante la directiva.
Componente 1:
@component(
selector:'com1'
)
export class com1{
function1(){...}
}
Componente 2:
@component(
selector:'com2'
)
export class com2{
function2(){...
// i want to call function 1 from com1 here
}
}
He intentado usar @input
y @output
pero no entiendo exactamente cómo usarlo y cómo llamar a esa función, ¿alguien puede ayudarme?
angular
angular2-components
noobProgrammer
fuente
fuente
Respuestas:
Si com1 y com2 son hermanos, puede usar
com2 emite un evento utilizando un
EventEmitter
Aquí el componente principal agrega un enlace de evento para escuchar
myEvent
eventos y luego llamacom1.function1()
cuando tal evento ocurre.#com1
es una variable de plantilla que permite hacer referencia a este elemento desde otra parte de la plantilla. Lo utilizamos para hacer quefunction1()
el controlador de eventos para losmyEvent
decom2
:Para otras opciones para comunicarse entre componentes, ver también interacción de componentes
fuente
<sibling1 (myEvent)="...">
es un enlace de evento para el padre / host, porque esa es la única forma en que Angular proporciona. Sin embargo, el controlador de eventos llama a un método en el otro hermano (com1
). El padre se usa como mediador.somecomponent.ts
?Primero, lo que necesita para comprender las relaciones entre los componentes. Entonces puede elegir el método de comunicación correcto. Trataré de explicar todos los métodos que conozco y utilizo en mi práctica para la comunicación entre componentes.
¿Qué tipo de relaciones entre componentes puede haber?
1. Padre> Niño
Compartir datos a través de la entrada
Este es probablemente el método más común para compartir datos. Funciona usando el
@Input()
decorador para permitir que los datos pasen a través de la plantilla.parent.component.ts
child.component.ts
Este es un método muy simple. Es fácil de usar. También podemos detectar cambios en los datos en el componente secundario utilizando ngOnChanges .
Pero no olvide que si usamos un objeto como datos y cambiamos los parámetros de este objeto, la referencia a él no cambiará. Por lo tanto, si queremos recibir un objeto modificado en un componente hijo, debe ser inmutable.
2. Niño> Padre
Compartir datos a través de ViewChild
ViewChild permite que un componente se inyecte en otro, dando al padre acceso a sus atributos y funciones. Sin embargo, una advertencia es que
child
no estará disponible hasta después de que se haya inicializado la vista. Esto significa que necesitamos implementar el enlace del ciclo de vida AfterViewInit para recibir los datos del niño.parent.component.ts
child.component.ts
Compartir datos a través de Output () y EventEmitter
Otra forma de compartir datos es emitir datos del elemento secundario, que el padre puede enumerar. Este enfoque es ideal cuando desea compartir los cambios de datos que ocurren en cosas como clics de botones, entradas de formularios y otros eventos de usuario.
parent.component.ts
child.component.ts
3. hermanos
Niño> Padre> Niño
Trato de explicar otras formas de comunicación entre hermanos a continuación. Pero ya podría entender una de las formas de entender los métodos anteriores.
parent.component.ts
child-one.component.ts
child-two.component.ts
4. Componentes no relacionados
Todos los métodos que he descrito a continuación se pueden usar para todas las opciones anteriores para la relación entre los componentes. Pero cada uno tiene sus propias ventajas y desventajas.
Compartir datos con un servicio
Al pasar datos entre componentes que carecen de una conexión directa, como hermanos, nietos, etc., debe usar un servicio compartido. Cuando tiene datos que siempre deben estar sincronizados, encuentro que RxJS BehaviorSubject es muy útil en esta situación.
data.service.ts
first.component.ts
second.component.ts
Compartir datos con una ruta
A veces, no solo necesita pasar datos simples entre componentes, sino también guardar algún estado de la página. Por ejemplo, queremos guardar un filtro en el mercado en línea y luego copiar este enlace y enviarlo a un amigo. Y esperamos que abra la página en el mismo estado que nosotros. La primera forma, y probablemente la más rápida, de hacerlo sería utilizar parámetros de consulta .
Los parámetros de consulta se ven más en la línea de
/people?id=
dóndeid
puede ser igual a cualquier cosa y puede tener tantos parámetros como desee. Los parámetros de consulta estarían separados por el carácter de y comercial.Cuando trabaje con parámetros de consulta, no necesita definirlos en su archivo de rutas, y pueden denominarse parámetros. Por ejemplo, tome el siguiente código:
page1.component.ts
En la página de recepción, recibiría estos parámetros de consulta como los siguientes:
page2.component.ts
NgRx
La última forma, que es más complicada pero más poderosa, es usar NgRx . Esta biblioteca no es para compartir datos; Es una poderosa biblioteca de gestión de estado. En un breve ejemplo, no puedo explicar cómo usarlo, pero puedes ir al sitio oficial y leer la documentación al respecto.
Para mí, NgRx Store resuelve múltiples problemas. Por ejemplo, cuando tiene que tratar con observables y cuando la responsabilidad de algunos datos observables se comparte entre diferentes componentes, las acciones de la tienda y el reductor aseguran que las modificaciones de datos siempre se realizarán "de la manera correcta".
También proporciona una solución confiable para el almacenamiento en caché de solicitudes HTTP. Podrá almacenar las solicitudes y sus respuestas para que pueda verificar que la solicitud que está realizando aún no tiene una respuesta almacenada.
Puede leer sobre NgRx y comprender si lo necesita en su aplicación o no:
Finalmente, quiero decir que antes de elegir algunos de los métodos para compartir datos, debe comprender cómo se utilizarán estos datos en el futuro. Quiero decir, quizás ahora puedes usar solo un
@Input
decorador para compartir un nombre de usuario y un apellido. Luego agregará un nuevo componente o un nuevo módulo (por ejemplo, un panel de administración) que necesita más información sobre el usuario. Esto significa que puede ser una mejor manera de utilizar un servicio para los datos del usuario o alguna otra forma de compartir datos. Debe pensarlo más antes de comenzar a implementar el intercambio de datos.fuente
Puede acceder al método del componente uno desde el componente dos.
componente uno
componente Dos
componente Dos archivos html
fuente
Componente 1 (hijo):
Componente 2 (padre):
fuente
@ViewChild
cuál funcionó para mí. Gracias por este ejemploDepende de la relación entre sus componentes (padre / hijo), pero la mejor forma genérica de hacer que los componentes de comunicación se comuniquen es usar un servicio compartido.
Vea este documento para más detalles:
Dicho esto, puede usar lo siguiente para proporcionar una instancia de com1 en com2:
En com2, puede usar lo siguiente:
fuente
@Input
en el campo?<button (click)="dbgraph.displayTableGraph()">Graph</button> <dbstats-graph #dbgraph></dbstats-graph>
Tenga en cuenta la variable local
#dbgraph
en el componente secundario, que el padre puede usar para acceder a sus métodos (dbgraph.displayTableGraph()
).fuente
Usando Dataservice podemos llamar a la función desde otro componente
Componente1: el componente al que llamamos la función
dataservice.ts
Componente2: el componente que contiene la función
fuente
if ( this.bookmarkRoot.callToggle.observers.length === 0 ) { this.bookmarkRoot.callToggle.subscribe(( data ) => { this.closeDrawer(); } ) }